Vehicle Detection Project

The goals / steps of this project are the following:

  • Perform a Histogram of Oriented Gradients (HOG) feature extraction on a labeled training set of images and train a classifier Linear SVM classifier
  • Optionally, you can also apply a color transform and append binned color features, as well as histograms of color, to your HOG feature vector.
  • Note: for those first two steps don't forget to normalize your features and randomize a selection for training and testing.
  • Implement a sliding-window technique and use your trained classifier to search for vehicles in images.
  • Run your pipeline on a video stream (start with the test_video.mp4 and later implement on full project_video.mp4) and create a heat map of recurring detections frame by frame to reject outliers and follow detected vehicles.
  • Estimate a bounding box for vehicles detected.

Histogram of Oriented Gradients (HOG)

1. Explain how (and identify where in your code) you extracted HOG features from the training images.

The code for this step is contained in the first code cell of the IPython notebook (Vehicle_Detection.ipynb).

I started by reading in all the vehicle and non-vehicle images. Here is an example of one of each of the vehicle and non-vehicle classes:

![alt text][image1]

I then explored different color spaces and different skimage.hog() parameters (orientations, pixels_per_cell, and cells_per_block). I grabbed random images from each of the two classes and displayed them to get a feel for what the skimage.hog() output looks like.

Here is an example using the YCrCb color space and HOG parameters of orientations=8, pixels_per_cell=(8, 8) and cells_per_block=(2, 2):

![alt text][image2]

2. Explain how you settled on your final choice of HOG parameters.

I tried various combinations of parameters and...

3. Describe how (and identify where in your code) you trained a classifier using your selected HOG features (and color features if you used them).

I trained a linear SVM using...

Preperation and utilities

Define Consts

In [1]:
MODE_GEN_FEATURES = False
MODE_TRAIN = False
MODE_EVAL = False
In [2]:
IMAGE_SUFFIX_JPG = ".jpeg"
IMAGE_SUFFIX_PNG = ".png"
In [3]:
TRAINING_IMAGE_SUFFIX = IMAGE_SUFFIX_JPG
DIR_TRAIN_DATA_SMALL = './sample_training_dataset/*_smallset/*/'

DIR_TRAIN_DATA_SMALL_VEHICLES = './sample_training_dataset/vehicles_smallset/*/'
DIR_TRAIN_DATA_SMALL_NON_VEHICLES = './sample_training_dataset/non-vehicles_smallset/*/'

DIR_TRAIN_DATA = DIR_TRAIN_DATA_SMALL + "*" + TRAINING_IMAGE_SUFFIX
DIR_TRAIN_DATA_VEHICLES = DIR_TRAIN_DATA_SMALL_VEHICLES + "*" + TRAINING_IMAGE_SUFFIX
DIR_TRAIN_DATA_NON_VEHICLES = DIR_TRAIN_DATA_SMALL_NON_VEHICLES + "*" + TRAINING_IMAGE_SUFFIX
print(DIR_TRAIN_DATA)
./sample_training_dataset/*_smallset/*/*.jpeg
In [4]:
TRAINING_IMAGE_SUFFIX = IMAGE_SUFFIX_PNG
DIR_TRAIN_DATA_FULL = './sample_training_dataset/*_fullset/*/'

DIR_TRAIN_DATA_FULL_VEHICLES = './sample_training_dataset/vehicles_fullset/*/'
DIR_TRAIN_DATA_FULL_NON_VEHICLES = './sample_training_dataset/non-vehicles_fullset/*/'

DIR_TRAIN_DATA = DIR_TRAIN_DATA_FULL + "*" + TRAINING_IMAGE_SUFFIX
DIR_TRAIN_DATA_VEHICLES = DIR_TRAIN_DATA_FULL_VEHICLES + "*" + TRAINING_IMAGE_SUFFIX
DIR_TRAIN_DATA_NON_VEHICLES = DIR_TRAIN_DATA_FULL_NON_VEHICLES + "*" + TRAINING_IMAGE_SUFFIX
print(DIR_TRAIN_DATA)
./sample_training_dataset/*_fullset/*/*.png

Import Packages

In [5]:
import numpy as np
import cv2
import glob
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
%matplotlib inline

import time

from sklearn.svm import LinearSVC
from sklearn.preprocessing import StandardScaler
from skimage.feature import hog

from sklearn.model_selection import train_test_split

import pickle
import os

Drawing Function

(from Manual Vehicle Detection: draw_bboxes.py)

In [6]:
def draw_boxes(img, bboxes, color=(0, 0, 255), thick=6):
    # Make a copy of the image
    draw_img = np.copy(img)
    # Iterate through the bounding boxes
    for bbox in bboxes:
        # Draw a rectangle given bbox coordinates
        cv2.rectangle(draw_img, bbox[0], bbox[1], color, thick)
    # Return the image copy with boxes drawn
    return draw_img

Histograms of Color

In [7]:
# from color_histogram.py
#Define a function to compute color histogram features  
def color_hist_demo(img, nbins=32, bins_range=(0, 256), vis=False):
    
    # Return the individual histograms, bin_centers and feature vectordef color_hist(img, nbins=32, bins_range=(0, 256)):
    # Compute the histogram of the RGB channels separately
    rhist = np.histogram(img[:,:,0], bins=nbins, range=bins_range)
    ghist = np.histogram(img[:,:,1], bins=nbins, range=bins_range)
    bhist = np.histogram(img[:,:,2], bins=nbins, range=bins_range)

    if vis == True:
        # Generating bin centers
        bin_edges = rhist[1]
        bin_centers = (bin_edges[1:]  + bin_edges[0:len(bin_edges)-1])/2
        # Concatenate the histograms into a single feature vector
        hist_features = np.concatenate((rhist[0], ghist[0], bhist[0]))
        # Return the individual histograms, bin_centers and feature vector
        return rhist, ghist, bhist, bin_centers, hist_features
    else:
        return hist_features

Color Histogram Demo

In [8]:
image = mpimg.imread('cutout1.jpg')
    
rh, gh, bh, bincen, feature_vec = color_hist_demo(image, nbins=32, bins_range=(0, 256), vis=True)

# Plot a figure with all three bar charts
if rh is not None:
    fig = plt.figure(figsize=(12,3))
    plt.subplot(131)
    plt.bar(bincen, rh[0])
    plt.xlim(0, 256)
    plt.title('R Histogram')
    plt.subplot(132)
    plt.bar(bincen, gh[0])
    plt.xlim(0, 256)
    plt.title('G Histogram')
    plt.subplot(133)
    plt.bar(bincen, bh[0])
    plt.xlim(0, 256)
    plt.title('B Histogram')
    fig.tight_layout()
else:
    print('Your function is returning None for at least one variable...')

Spatial Binning of Color

In [9]:
"""spatial_bin.py"""
# Define a function to compute color histogram features  
# Pass the color_space flag as 3-letter all caps string
# like 'HSV' or 'LUV' etc.
# KEEP IN MIND IF YOU DECIDE TO USE THIS FUNCTION LATER
# IN YOUR PROJECT THAT IF YOU READ THE IMAGE WITH 
# cv2.imread() INSTEAD YOU START WITH BGR COLOR!
def bin_spatial_demo(img, color_space='RGB', size=(32, 32)):
    # Convert image to new color space (if specified)
    if color_space != 'RGB':
        if color_space == 'HSV':
            feature_image = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
        elif color_space == 'LUV':
            feature_image = cv2.cvtColor(img, cv2.COLOR_RGB2LUV)
        elif color_space == 'HLS':
            feature_image = cv2.cvtColor(img, cv2.COLOR_RGB2HLS)
        elif color_space == 'YUV':
            feature_image = cv2.cvtColor(img, cv2.COLOR_RGB2YUV)
        elif color_space == 'YCrCb':
            feature_image = cv2.cvtColor(img, cv2.COLOR_RGB2YCrCb)
    else: feature_image = np.copy(img)             
    # Use cv2.resize().ravel() to create the feature vector
    features = cv2.resize(feature_image, size).ravel() 
    # Return the feature vector
    return features

Spatial Bining Demo

In [10]:
image = mpimg.imread('cutout1.jpg')
    
feature_vec = bin_spatial_demo(image, color_space='RGB', size=(32, 32))

# Plot features
plt.plot(feature_vec)
plt.title('Spatially Binned Features')
Out[10]:
<matplotlib.text.Text at 0x1812312cd68>

Data Exploration

In [11]:
# Define a function to return some characteristics of the dataset 
def data_look(car_list, notcar_list):
    data_dict = {}
    # Define a key in data_dict "n_cars" and store the number of car images
    data_dict["n_cars"] = len(car_list)
    # Define a key "n_notcars" and store the number of notcar images
    data_dict["n_notcars"] = len(notcar_list)
    # Read in a test image, either car or notcar
    example_img = mpimg.imread(car_list[0])
    # Define a key "image_shape" and store the test image shape 3-tuple
    data_dict["image_shape"] = example_img.shape
    # Define a key "data_type" and store the data type of the test image.
    data_dict["data_type"] = example_img.dtype
    # Return data_dict
    return data_dict
In [12]:
def load_images(dir_path):
    images = glob.glob(dir_path)
    files = []
    for image in images:
        files.append(image)

    print(len(files))
    if (len(files) == 0) :
        print("Empty data")

    return files

def load_train_data():
    cars = load_images(DIR_TRAIN_DATA_VEHICLES)
    notcars = load_images(DIR_TRAIN_DATA_NON_VEHICLES)
    return cars, notcars
In [13]:
cars, notcars = load_train_data()

print(len(cars), len(notcars))
if (len(cars) != 0 and len(notcars) != 0) :
    data_info = data_look(cars, notcars)
else:
    print("Empty data")

print('Your function returned a count of', 
      data_info["n_cars"], ' cars and', 
      data_info["n_notcars"], ' non-cars')
print('of size: ',data_info["image_shape"], ' and data type:', 
      data_info["data_type"])
# Just for fun choose random car / not-car indices and plot example images   
car_ind = np.random.randint(0, len(cars))
notcar_ind = np.random.randint(0, len(notcars))

# Read in car / not-car images
car_image = mpimg.imread(cars[car_ind])
notcar_image = mpimg.imread(notcars[notcar_ind])

# Plot the examples
fig = plt.figure()
plt.subplot(121)
plt.imshow(car_image)
plt.title('Example Car Image')
plt.subplot(122)
plt.imshow(notcar_image)
plt.title('Example Not-car Image')

#print(car_image)
8792
8968
8792 8968
Your function returned a count of 8792  cars and 8968  non-cars
of size:  (64, 64, 3)  and data type: float32
Out[13]:
<matplotlib.text.Text at 0x181243e1a20>

scikit-image HOG

In [14]:
# Define a function to return HOG features and visualization
def get_hog_features(img, orient, pix_per_cell, cell_per_block, vis=False, feature_vec=True):
    if vis == True:
        features, hog_image = hog(img, orientations=orient, pixels_per_cell=(pix_per_cell, pix_per_cell),
                                  cells_per_block=(cell_per_block, cell_per_block), transform_sqrt=False, 
                                  visualise=True, feature_vector=False)
        return features, hog_image
    else:      
        features = hog(img, orientations=orient, pixels_per_cell=(pix_per_cell, pix_per_cell),
                       cells_per_block=(cell_per_block, cell_per_block), transform_sqrt=False, 
                       visualise=False, feature_vector=feature_vec)
        return features

HOG Visualization Demo

In [15]:
"""get_hog.py"""
# Read in our vehicles and non-vehicles

# Generate a random index to look at a car image
ind = np.random.randint(0, len(cars))
# Read in the image
image = mpimg.imread(cars[ind])
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
# Define HOG parameters
orient = 9
pix_per_cell = 8
cell_per_block = 2
# Call our function with vis=True to see an image output
features, hog_image = get_hog_features(gray, orient, 
                        pix_per_cell, cell_per_block, 
                        vis=True, feature_vec=False)
# Plot the examples
fig = plt.figure()
plt.subplot(121)
plt.imshow(image, cmap='gray')
plt.title('Example Car Image')
plt.subplot(122)
plt.imshow(hog_image, cmap='gray')
plt.title('HOG Visualization')
C:\Anaconda3\envs\carnd-term1\lib\site-packages\skimage\feature\_hog.py:119: skimage_deprecation: Default value of `block_norm`==`L1` is deprecated and will be changed to `L2-Hys` in v0.15
  'be changed to `L2-Hys` in v0.15', skimage_deprecation)
Out[15]:
<matplotlib.text.Text at 0x181244af2e8>

Combine and Normalize Features

Norm_shuffle.py

In [16]:
def convert_color(img, color_space):
    if color_space != 'RGB':
        if color_space == 'HSV':
            return cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
        elif color_space == 'LUV':
            return cv2.cvtColor(img, cv2.COLOR_RGB2LUV)
        elif color_space == 'HLS':
            return cv2.cvtColor(img, cv2.COLOR_RGB2HLS)
        elif color_space == 'YUV':
            return cv2.cvtColor(img, cv2.COLOR_RGB2YUV)
        elif color_space == 'YCrCb':
            return cv2.cvtColor(img, cv2.COLOR_RGB2YCrCb)
    else: return np.copy(img)
In [17]:
# Define a function to compute binned color features  
def bin_spatial(img, size=(32, 32)):
    # Use cv2.resize().ravel() to create the feature vector
    features = cv2.resize(img, size).ravel() 
    # Return the feature vector
    return features

# Define a function to compute color histogram features  
def color_hist(img, nbins=32, bins_range=(0, 256)):
    # Compute the histogram of the color channels separately
    channel1_hist = np.histogram(img[:,:,0], bins=nbins, range=bins_range)
    channel2_hist = np.histogram(img[:,:,1], bins=nbins, range=bins_range)
    channel3_hist = np.histogram(img[:,:,2], bins=nbins, range=bins_range)
    # Concatenate the histograms into a single feature vector
    hist_features = np.concatenate((channel1_hist[0], channel2_hist[0], channel3_hist[0]))
    # Return the individual histograms, bin_centers and feature vector
    return hist_features
In [18]:
# Define a function to extract features from a list of images
# Have this function call bin_spatial() and color_hist()
def extract_features(imgs, color_space='RGB', spatial_size=(32, 32),
                        hist_bins=32, 
                        hist_range=None,
                        orient=9, 
                        pix_per_cell=8, cell_per_block=2, hog_channel=0,
                        spatial_feat=True, hist_feat=True, hog_feat=True):
    # Create a list to append feature vectors to
    features = []
    # Iterate through the list of images
    for file in imgs:
        file_features = []
        # Read in each one by one
        image = mpimg.imread(file)
        # apply color conversion 
        feature_image = convert_color(image, color_space)

        if spatial_feat == True:
            spatial_features = bin_spatial(feature_image, size=spatial_size)
            file_features.append(spatial_features)
        if hist_feat == True:
            # Apply color_hist()
            if hist_range == None:
                 hist_features = color_hist(feature_image, nbins=hist_bins)
            else:
                # Apply color_hist() also with a color space option now
                hist_features = color_hist(feature_image, nbins=hist_bins, bins_range=hist_range)
        
            file_features.append(hist_features)
        if hog_feat == True:
        # Call get_hog_features() with vis=False, feature_vec=True
            if hog_channel == 'ALL':
                hog_features = []
                for channel in range(feature_image.shape[2]):
                    hog_features.append(get_hog_features(feature_image[:,:,channel], 
                                        orient, pix_per_cell, cell_per_block, 
                                        vis=False, feature_vec=True))
                hog_features = np.ravel(hog_features)        
            else:
                hog_features = get_hog_features(feature_image[:,:,hog_channel], orient, 
                            pix_per_cell, cell_per_block, vis=False, feature_vec=True)
            # Append the new feature vector to the features list
            file_features.append(hog_features)
        features.append(np.concatenate(file_features))
    # Return list of feature vectors
    return features
In [19]:
def dump_features(targets, nottargets):
    cur_dir = os.path.dirname(".")
    dest = os.path.join(cur_dir, 'pkl_objects')
    print(dest)
    if not os.path.exists(dest):
        os.mkdir(dest)
    pickle.dump(targets, open(os.path.join(dest, 'targets.pkl'), 'wb'), protocol=4)
    pickle.dump(nottargets, open(os.path.join(dest, 'nottargets.pkl'), 'wb'), protocol=4)
In [20]:
def load_features():
    cur_dir = os.path.dirname(".")
    src = os.path.join(cur_dir, 'pkl_objects')
    targets = pickle.load(open(os.path.join(src, 'targets.pkl'), 'rb'))
    nottargets = pickle.load(open(os.path.join(src, 'nottargets.pkl'), 'rb'))
    return targets, nottargets
In [21]:
# THESE DUMPS ARE NOT USED FOR TRAINING BUT DEMO ONLY NOW
if MODE_GEN_FEATURES == True:
    car_features = extract_features(cars, color_space='RGB',#cspace='RGB', 
                                spatial_size=(16, 16),#spatial_size=(32, 32),
                        hist_bins=32, hist_range=(0, 256))
    notcar_features = extract_features(notcars, color_space='RGB',#cspace='RGB', 
                                   spatial_size=(16, 16),#spatial_size=(32, 32),
                        hist_bins=32, hist_range=(0, 256))
    dump_features(car_features, notcar_features)
else:
    car_features, notcar_features = load_features()
    print("Use dumped features")
Use dumped features

Features Normalization Demo

In [22]:
print(len(car_features))
print(len(notcar_features))

if len(car_features) > 0:
    # Create an array stack of feature vectors
    X = np.vstack((car_features, notcar_features)).astype(np.float64)                        
    # Fit a per-column scaler
    X_scaler = StandardScaler().fit(X)
    # Apply the scaler to X
    scaled_X = X_scaler.transform(X)
    car_ind = np.random.randint(0, len(cars))
    # Plot an example of raw and scaled features
    fig = plt.figure(figsize=(12,4))
    plt.subplot(131)
    plt.imshow(mpimg.imread(cars[car_ind]))
    plt.title('Original Image')
    plt.subplot(132)
    plt.plot(X[car_ind])
    plt.title('Raw Features')
    plt.subplot(133)
    plt.plot(scaled_X[car_ind])
    plt.title('Normalized Features')
    fig.tight_layout()
else: 
    print('Your function only returns empty feature vectors...')
8792
8968

Parameter Tuning

1. Describe how (and identify where in your code) you implemented a sliding window search. How did you decide what scales to search and how much to overlap windows?

I decided to search random window positions at random scales all over the image and came up with this (ok just kidding I didn't actually ;):

![alt text][image3]

2. Show some examples of test images to demonstrate how your pipeline is working. What did you do to optimize the performance of your classifier?

Ultimately I searched on two scales using YCrCb 3-channel HOG features plus spatially binned color and histograms of color in the feature vector, which provided a nice result. Here are some example images:

![alt text][image4]

In [23]:
"""based on sliding_window.py"""

"""
solution.py
"""
# Define a function that takes an image,
# start and stop positions in both x and y, 
# window size (x and y dimensions),  
# and overlap fraction (for both x and y)
def slide_window(img, x_start_stop=[None, None], y_start_stop=[None, None], 
                    xy_window=(64, 64), xy_overlap=(0.5, 0.5)):
    # If x and/or y start/stop positions not defined, set to image size
    if x_start_stop[0] == None:
        x_start_stop[0] = 0
    if x_start_stop[1] == None:
        x_start_stop[1] = img.shape[1]
    if y_start_stop[0] == None:
        y_start_stop[0] = 0
    if y_start_stop[1] == None:
        y_start_stop[1] = img.shape[0]
    # Compute the span of the region to be searched    
    xspan = x_start_stop[1] - x_start_stop[0]
    yspan = y_start_stop[1] - y_start_stop[0]
    # Compute the number of pixels per step in x/y
    nx_pix_per_step = np.int(xy_window[0]*(1 - xy_overlap[0]))
    ny_pix_per_step = np.int(xy_window[1]*(1 - xy_overlap[1]))
    # Compute the number of windows in x/y
    nx_buffer = np.int(xy_window[0]*(xy_overlap[0]))
    ny_buffer = np.int(xy_window[1]*(xy_overlap[1]))
    nx_windows = np.int((xspan-nx_buffer)/nx_pix_per_step) 
    ny_windows = np.int((yspan-ny_buffer)/ny_pix_per_step) 
    # Initialize a list to append window positions to
    window_list = []
    # Loop through finding x and y window positions
    # Note: you could vectorize this step, but in practice
    # you'll be considering windows one by one with your
    # classifier, so looping makes sense
    for ys in range(ny_windows):
        for xs in range(nx_windows):
            # Calculate window position
            startx = xs*nx_pix_per_step + x_start_stop[0]
            endx = startx + xy_window[0]
            starty = ys*ny_pix_per_step + y_start_stop[0]
            endy = starty + xy_window[1]
            # Append window position to list
            window_list.append(((startx, starty), (endx, endy)))
    # Return the list of windows
    return window_list

Search and Classify

Search_classify.py

lesson_function.py

In [24]:
# Define a function that takes an image,
# start and stop positions in both x and y, 
# window size (x and y dimensions),  
# and overlap fraction (for both x and y)
def slide_window(img, x_start_stop=[None, None], y_start_stop=[None, None], 
                    xy_window=(64, 64), xy_overlap=(0.5, 0.5)):
    # If x and/or y start/stop positions not defined, set to image size
    if x_start_stop[0] == None:
        x_start_stop[0] = 0
    if x_start_stop[1] == None:
        x_start_stop[1] = img.shape[1]
    if y_start_stop[0] == None:
        y_start_stop[0] = 0
    if y_start_stop[1] == None:
        y_start_stop[1] = img.shape[0]
    # Compute the span of the region to be searched    
    xspan = x_start_stop[1] - x_start_stop[0]
    yspan = y_start_stop[1] - y_start_stop[0]
    # Compute the number of pixels per step in x/y
    nx_pix_per_step = np.int(xy_window[0]*(1 - xy_overlap[0]))
    ny_pix_per_step = np.int(xy_window[1]*(1 - xy_overlap[1]))
    # Compute the number of windows in x/y
    nx_buffer = np.int(xy_window[0]*(xy_overlap[0]))
    ny_buffer = np.int(xy_window[1]*(xy_overlap[1]))
    nx_windows = np.int((xspan-nx_buffer)/nx_pix_per_step) 
    ny_windows = np.int((yspan-ny_buffer)/ny_pix_per_step) 
    # Initialize a list to append window positions to
    window_list = []
    # Loop through finding x and y window positions
    # Note: you could vectorize this step, but in practice
    # you'll be considering windows one by one with your
    # classifier, so looping makes sense
    for ys in range(ny_windows):
        for xs in range(nx_windows):
            # Calculate window position
            startx = xs*nx_pix_per_step + x_start_stop[0]
            endx = startx + xy_window[0]
            starty = ys*ny_pix_per_step + y_start_stop[0]
            endy = starty + xy_window[1]
            
            # Append window position to list
            window_list.append(((startx, starty), (endx, endy)))
    # Return the list of windows
    return window_list
In [25]:
"""
solution.py
"""
# Define a function to extract features from a single image window
# This function is very similar to extract_features()
# just for a single image rather than list of images
def single_img_features(img, color_space='RGB', spatial_size=(32, 32),
                        hist_bins=32, orient=9, 
                        pix_per_cell=8, cell_per_block=2, hog_channel=0,
                        spatial_feat=True, hist_feat=True, hog_feat=True):    
    #1) Define an empty list to receive features
    img_features = []
    #2) Apply color conversion if other than 'RGB'
    if color_space != 'RGB':
        if color_space == 'HSV':
            feature_image = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
        elif color_space == 'LUV':
            feature_image = cv2.cvtColor(img, cv2.COLOR_RGB2LUV)
        elif color_space == 'HLS':
            feature_image = cv2.cvtColor(img, cv2.COLOR_RGB2HLS)
        elif color_space == 'YUV':
            feature_image = cv2.cvtColor(img, cv2.COLOR_RGB2YUV)
        elif color_space == 'YCrCb':
            feature_image = cv2.cvtColor(img, cv2.COLOR_RGB2YCrCb)
    else: feature_image = np.copy(img)      
    #3) Compute spatial features if flag is set
    if spatial_feat == True:
        spatial_features = bin_spatial(feature_image, size=spatial_size)
        #4) Append features to list
        img_features.append(spatial_features)
    #5) Compute histogram features if flag is set
    if hist_feat == True:
        hist_features = color_hist(feature_image, nbins=hist_bins)
        #6) Append features to list
        img_features.append(hist_features)
    #7) Compute HOG features if flag is set
    if hog_feat == True:
        if hog_channel == 'ALL':
            hog_features = []
            for channel in range(feature_image.shape[2]):
                hog_features.extend(get_hog_features(feature_image[:,:,channel], 
                                    orient, pix_per_cell, cell_per_block, 
                                    vis=False, feature_vec=True))      
        else:
            hog_features = get_hog_features(feature_image[:,:,hog_channel], orient, 
                        pix_per_cell, cell_per_block, vis=False, feature_vec=True)
        #8) Append features to list
        img_features.append(hog_features)

    #9) Return concatenated array of features
    return np.concatenate(img_features)

# Define a function you will pass an image 
# and the list of windows to be searched (output of slide_windows())
def search_windows(img, windows, clf, scaler, color_space='RGB', 
                    spatial_size=(32, 32), hist_bins=32, 
                    hist_range=(0, 256), orient=9, 
                    pix_per_cell=8, cell_per_block=2, 
                    hog_channel=0, spatial_feat=True, 
                    hist_feat=True, hog_feat=True):

    #1) Create an empty list to receive positive detection windows
    on_windows = []
    #2) Iterate over all windows in the list
    for window in windows:
        #3) Extract the test window from original image
        test_img = cv2.resize(img[window[0][1]:window[1][1], window[0][0]:window[1][0]], (64, 64))      
        #4) Extract features for that window using single_img_features()
        features = single_img_features(test_img, color_space=color_space, 
                            spatial_size=spatial_size, hist_bins=hist_bins, 
                            orient=orient, pix_per_cell=pix_per_cell, 
                            cell_per_block=cell_per_block, 
                            hog_channel=hog_channel, spatial_feat=spatial_feat, 
                            hist_feat=hist_feat, hog_feat=hog_feat)
        #5) Scale extracted features to be fed to classifier
        test_features = scaler.transform(np.array(features).reshape(1, -1))
        #6) Predict using your classifier
        prediction = clf.predict(test_features)
        #7) If positive (prediction == 1) then save the window
        if prediction == 1:
            on_windows.append(window)
    #8) Return windows for positive detections
    return on_windows
In [26]:
def single_img_features_w_config(img, config):
    color_space=config.color_space 
    spatial_size=config.spatial_size
    hist_bins=config.hist_bins
    orient=config.orient
    pix_per_cell=config.pix_per_cell 
    cell_per_block=config.cell_per_block 
    hog_channel=config.hog_channel
    spatial_feat=config.spatial_feat 
    hist_feat=config.hist_feat
    hog_feat=config.hog_feat
    
    #1) Define an empty list to receive features
    img_features = []
    #2) Apply color conversion if other than 'RGB'
    if color_space != 'RGB':
        if color_space == 'HSV':
            feature_image = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
        elif color_space == 'LUV':
            feature_image = cv2.cvtColor(img, cv2.COLOR_RGB2LUV)
        elif color_space == 'HLS':
            feature_image = cv2.cvtColor(img, cv2.COLOR_RGB2HLS)
        elif color_space == 'YUV':
            feature_image = cv2.cvtColor(img, cv2.COLOR_RGB2YUV)
        elif color_space == 'YCrCb':
            feature_image = cv2.cvtColor(img, cv2.COLOR_RGB2YCrCb)
    else: feature_image = np.copy(img)      
    #3) Compute spatial features if flag is set
    if spatial_feat == True:
        spatial_features = bin_spatial(feature_image, size=spatial_size)
        #4) Append features to list
        img_features.append(spatial_features)
    #5) Compute histogram features if flag is set
    if hist_feat == True:
        hist_features = color_hist(feature_image, nbins=hist_bins)
        #6) Append features to list
        img_features.append(hist_features)
    #7) Compute HOG features if flag is set
    if hog_feat == True:
        if hog_channel == 'ALL':
            hog_features = []
            for channel in range(feature_image.shape[2]):
                hog_features.extend(get_hog_features(feature_image[:,:,channel], 
                                    orient, pix_per_cell, cell_per_block, 
                                    vis=False, feature_vec=True))      
        else:
            hog_features = get_hog_features(feature_image[:,:,hog_channel], orient, 
                        pix_per_cell, cell_per_block, vis=False, feature_vec=True)
        #8) Append features to list
        img_features.append(hog_features)

    #9) Return concatenated array of features
    return np.concatenate(img_features)

# Define a function you will pass an image 
# and the list of windows to be searched (output of slide_windows())
def search_windows_w_config(img, windows, clf, scaler, config):

    color_space=config.color_space 
    spatial_size=config.spatial_size
    hist_bins=config.hist_bins
    orient=config.orient
    pix_per_cell=config.pix_per_cell 
    cell_per_block=config.cell_per_block 
    hog_channel=config.hog_channel
    spatial_feat=config.spatial_feat 
    hist_feat=config.hist_feat
    hog_feat=config.hog_feat
    
    #1) Create an empty list to receive positive detection windows
    on_windows = []
    #2) Iterate over all windows in the list
    for window in windows:
        #3) Extract the test window from original image
        test_img = cv2.resize(img[window[0][1]:window[1][1], window[0][0]:window[1][0]], (64, 64))      
        #4) Extract features for that window using single_img_features()
        features = single_img_features(test_img, color_space=color_space, 
                            spatial_size=spatial_size, hist_bins=hist_bins, 
                            orient=orient, pix_per_cell=pix_per_cell, 
                            cell_per_block=cell_per_block, 
                            hog_channel=hog_channel, spatial_feat=spatial_feat, 
                            hist_feat=hist_feat, hog_feat=hog_feat)
        #5) Scale extracted features to be fed to classifier
        test_features = scaler.transform(np.array(features).reshape(1, -1))
        #6) Predict using your classifier
        prediction = clf.predict(test_features)
        #7) If positive (prediction == 1) then save the window
        if prediction == 1:
            on_windows.append(window)
    #8) Return windows for positive detections
    return on_windows

Features Extraction

=============================================================================

Linear SVC

https://discussions.udacity.com/t/white-cars-aargh/227914/14

color_space = YCrCb orient = 11 pix_per_cell = 8 cell_per_block = 2 hog_channel = 'ALL' spatial_size = (32,32) hist_bins = 32 spatial_feat = True hist_feat = True hog_feat = True

threshold = 3 scales of 1. and 1.5 ???????????????????????? The heatmap number of frames in a deque to average = 10.

The cars list is from the Udacity vehicles dataset. The notcars list is from the Udacity non-vehicles dataset.

Class and Function Definition

In [27]:
"""
Recomendation from Forum
cspace = 'HSV' # RGB, HSV, LUV, HLS, YUV or YCrCb
orient = 9
pix_per_cell = 8
cell_per_block = 2
hog_channel = 1 # 0, 1, 2, or "ALL"
spatial_size = (16,16) # Spatial binning dimensions
hist_bins = 16
spatial_feat = True # Spatial features on or off
hist_feat = True # Histogram features on or off
hog_feat = True # HOG features on or off

"""
class Config():
    def __init__(self, color_space, 
                            spatial_size= (16,16), hist_bins=16, 
                            orient=9, pix_per_cell=8, 
                            cell_per_block=2, 
                            hog_channel='ALL', 
                            spatial_feat=True, 
                            hist_feat=True, hog_feat=True):
        self.color_space=color_space 
        self.spatial_size=spatial_size
        self.hist_bins=hist_bins
        self.orient=orient
        self.pix_per_cell=pix_per_cell 
        self.cell_per_block=cell_per_block 
        self.hog_channel=hog_channel
        self.spatial_feat=spatial_feat 
        self.hist_feat=hist_feat
        self.hog_feat=hog_feat
    def desc(self):
        return self.color_space + ", hog cannel={}, hist_bins={}".format(self.hog_channel, self.hist_bins)

def train_svc(config, targets, nottargets, eval=False):
    color_space=config.color_space 
    spatial_size=config.spatial_size
    hist_bins=config.hist_bins
    orient=config.orient
    pix_per_cell=config.pix_per_cell 
    cell_per_block=config.cell_per_block 
    hog_channel=config.hog_channel
    spatial_feat=config.spatial_feat 
    hist_feat=config.hist_feat
    hog_feat=config.hog_feat
        
    target_features = extract_features(targets, color_space=color_space, 
                            spatial_size=spatial_size, hist_bins=hist_bins, 
                            orient=orient, pix_per_cell=pix_per_cell, 
                            cell_per_block=cell_per_block, 
                            hog_channel=hog_channel, spatial_feat=spatial_feat, 
                            hist_feat=hist_feat, hog_feat=hog_feat)
    nottarget_features = extract_features(nottargets, color_space=color_space, 
                            spatial_size=spatial_size, hist_bins=hist_bins, 
                            orient=orient, pix_per_cell=pix_per_cell, 
                            cell_per_block=cell_per_block, 
                            hog_channel=hog_channel, spatial_feat=spatial_feat, 
                            hist_feat=hist_feat, hog_feat=hog_feat)

    X = np.vstack((target_features, nottarget_features)).astype(np.float64)                        
    # Fit a per-column scaler
    X_scaler = StandardScaler().fit(X)
    # Apply the scaler to X
    scaled_X = X_scaler.transform(X)

    # Define the labels vector
    y = np.hstack((np.ones(len(target_features)), np.zeros(len(nottarget_features))))


    # Split up data into randomized training and test sets
    rand_state = np.random.randint(0, 100)
    X_train, X_test, y_train, y_test = train_test_split(
        scaled_X, y, test_size=0.2, random_state=rand_state)

    print('Using:',orient,'orientations',pix_per_cell,
       'pixels per cell and', cell_per_block,'cells per block')
    print('Feature vector length:', len(X_train[0]))


    if eval == True:
        return X_train, y_train
    else:
        # Use a linear SVC 
        svc = LinearSVC()
        # Check the training time for the SVC
        t=time.time()
        svc.fit(X_train, y_train)
        t2 = time.time()
        print(round(t2-t, 2), 'Seconds to train SVC...')
        # Check the score of the SVC
        print('Test Accuracy of SVC = ', round(svc.score(X_test, y_test), 4))
        # Check the prediction time for a single sample
        t=time.time()
        n_predict = 10
        print('My SVC predicts: ', svc.predict(X_test[0:n_predict]))
        print('For these',n_predict, 'labels: ', y_test[0:n_predict])
        t2 = time.time()
        print(round(t2-t, 5), 'Seconds to predict', n_predict,'labels with SVC')
        print('')
        return svc, X_scaler
In [28]:
def train_svc_w_features(target_features, nottarget_features, eval=False):

    X = np.vstack((target_features, nottarget_features)).astype(np.float64)                        
    # Fit a per-column scaler
    X_scaler = StandardScaler().fit(X)
    # Apply the scaler to X
    scaled_X = X_scaler.transform(X)

    # Define the labels vector
    y = np.hstack((np.ones(len(target_features)), np.zeros(len(nottarget_features))))


    # Split up data into randomized training and test sets
    rand_state = np.random.randint(0, 100)
    X_train, X_test, y_train, y_test = train_test_split(
        scaled_X, y, test_size=0.2, random_state=rand_state)

    #print('Using:',orient,'orientations',pix_per_cell,
    #    'pixels per cell and', cell_per_block,'cells per block')
    print('Feature vector length:', len(X_train[0]))


    if eval == True:
        return X_train, y_train
    else:
        # Use a linear SVC 
        svc = LinearSVC()
        # Check the training time for the SVC
        t=time.time()
        svc.fit(X_train, y_train)
        t2 = time.time()
        print(round(t2-t, 2), 'Seconds to train SVC...')
        # Check the score of the SVC
        print('Test Accuracy of SVC = ', round(svc.score(X_test, y_test), 4))
        # Check the prediction time for a single sample
        t=time.time()
        n_predict = 10
        print('My SVC predicts: ', svc.predict(X_test[0:n_predict]))
        print('For these',n_predict, 'labels: ', y_test[0:n_predict])
        t2 = time.time()
        print(round(t2-t, 5), 'Seconds to predict', n_predict,'labels with SVC')
        print('')
        return svc, X_scaler
In [29]:
def prep_training(target_features, nottarget_features):

    X = np.vstack((target_features, nottarget_features)).astype(np.float64)                        
    # Fit a per-column scaler
    X_scaler = StandardScaler().fit(X)
    # Apply the scaler to X
    scaled_X = X_scaler.transform(X)

    # Define the labels vector
    y = np.hstack((np.ones(len(target_features)), np.zeros(len(nottarget_features))))

    # Split up data into randomized training and test sets
    rand_state = np.random.randint(0, 100)
    X_train, X_test, y_train, y_test = train_test_split(
        scaled_X, y, test_size=0.2, random_state=rand_state)

    #print('Using:',orient,'orientations',pix_per_cell,
    #    'pixels per cell and', cell_per_block,'cells per block')
    #print('Feature vector length:', len(X_train[0]))
    
    return X_train, y_train, X_test, y_test, X_scaler

def train_linear_svc(X_train, y_train, X_test, y_test):
    # Use a linear SVC 
    svc = LinearSVC()
    # Check the training time for the SVC
    t=time.time()
    svc.fit(X_train, y_train)
    t2 = time.time()
    print(round(t2-t, 2), 'Seconds to train SVC...')
    # Check the score of the SVC
    print('Test Accuracy of SVC = ', round(svc.score(X_test, y_test), 4))
    # Check the prediction time for a single sample
    t=time.time()
    n_predict = 10
    print('My SVC predicts: ', svc.predict(X_test[0:n_predict]))
    print('For these',n_predict, 'labels: ', y_test[0:n_predict])
    t2 = time.time()
    print(round(t2-t, 5), 'Seconds to predict', n_predict,'labels with SVC')
    print('')
    return svc
In [30]:
def dump_trained(clr, scaler, config):
    cur_dir = os.path.dirname(".")
    dest = os.path.join(cur_dir, 'pkl_objects')
    print(dest)
    if not os.path.exists(dest):
        os.mkdir(dest)
    pickle.dump(clr, open(os.path.join(dest, 'classifier.pkl'), 'wb'), protocol=4)
    pickle.dump(scaler, open(os.path.join(dest, 'scaler.pkl'), 'wb'), protocol=4)
    pickle.dump(config, open(os.path.join(dest, 'config.pkl'), 'wb'), protocol=4)
In [31]:
def load_trained():
    cur_dir = os.path.dirname(".")
    src = os.path.join(cur_dir, 'pkl_objects')
    clr = pickle.load(open(os.path.join(src, 'classifier.pkl'), 'rb'))
    scaler = pickle.load(open(os.path.join(src, 'scaler.pkl'), 'rb'))
    config = pickle.load(open(os.path.join(src, 'config.pkl'), 'rb'))
    return clr, scaler, config

Training Execution

""" Recomendation from Forum

  • cspace = 'HSV' # RGB, HSV, LUV, HLS, YUV or YCrCb
  • orient = 9
  • pix_per_cell = 8
  • cell_per_block = 2
  • hog_channel = 1 # 0, 1, 2, or "ALL"
  • spatial_size = (16,16) # Spatial binning dimensions
  • hist_bins = 16
  • spatial_feat = True # Spatial features on or off
  • hist_feat = True # Histogram features on or off
  • hog_feat = True # HOG features on or off

"""

Tweak these parameters and see how the results change.

  • color_space ='HSV' # 'HLS' #'RGB' # Can be RGB, HSV, LUV, HLS, YUV, YCrCb
  • orient = 9 # HOG orientations
  • pix_per_cell = 8 # HOG pixels per cell
  • cell_per_block = 2 # HOG cells per block
  • hog_channel = "ALL"#1 # "ALL" #0 # Can be 0, 1, 2, or "ALL"
  • spatial_size = (16, 16) # Spatial binning dimensions
  • hist_bins = 16#32#16#32 #16 # Number of histogram bins
  • spatial_feat = True # Spatial features on or off
  • hist_feat = True # Histogram features on or off
  • hog_feat = True # HOG features on or off
  • y_start_stop = [None, None] # Min and max in y to search in slide_window()
In [32]:
def set_config():
    config = Config(color_space ='HSV', 
                            spatial_size= (16,16), hist_bins=16, 
                            orient=9, pix_per_cell=8, 
                            cell_per_block=2, 
                            hog_channel="ALL", 
                            spatial_feat=True, 
                            hist_feat=True, hog_feat=True)
    return config
In [33]:
if MODE_TRAIN == True:
    config = set_config()
    clr, scaler = train_svc(config, cars, notcars)
    dump_trained(clr, scaler, config)
else:
    clr, scaler, config = load_trained()
        
    print("Use dumped data")
Use dumped data
In [34]:
#cspace = 'HSV' # RGB, HSV, LUV, HLS, YUV or YCrCb
config_list = [#
    #Config('RGB'),Config('RGB',hog_channel = 'ALL'), 
    #Config('HSV'),Config('HSV',hog_channel = 'ALL') ,Config('HSV',hog_channel = 'ALL', hist_bins = 32)  ,
    #Config('LUV'),Config('LUV',hog_channel = 'ALL') ,
    #Config('HLS'),Config('HLS',hog_channel = 'ALL') ,
    #Config('YUV'),Config('YUV',hog_channel = 'ALL'),
    #Config('YCrCb'),Config('YCrCb',hog_channel = 'ALL')
    ]
svc_list = []
for config in config_list:
    print(config.desc())
    svc_list.append(train_svc(config))

print(len(svc_list))
0
In [35]:
# feasibility check
svc = clr
X_scaler = scaler

Cross-validation with GridSearchCV

In [36]:
from sklearn import svm, grid_search
def eval_parameters(X_train, y_train):
    """Cross-validation with GridSearchCV"""
    svr = svm.SVC()
    grid_search = grid_search.GridSearchCV(svr, tuned_parameters, cv=5)

    t=time.time()
    grid_search.fit(X_train, y_train) 
    t2 = time.time()
    print(round(t2-t, 2), 'Seconds to train SVC(with GridSearchCV)...')
    print(grid_search.grid_scores_)
    print(grid_search.grid_scores_)
    print(grid_search.grid_scores_)
C:\Anaconda3\envs\carnd-term1\lib\site-packages\sklearn\cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.
  "This module will be removed in 0.20.", DeprecationWarning)
C:\Anaconda3\envs\carnd-term1\lib\site-packages\sklearn\grid_search.py:42: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. This module will be removed in 0.20.
  DeprecationWarning)
In [37]:
tuned_parameters = {'kernel':['linear'], 'C':[0.1, 1,10]}
if MODE_EVAL == True:
    config = set_config()
    #X_train, y_train = train_svc(config, cars, notcars, eval=True)
    X_train, y_train =train_svc_w_features(car_features, notcar_features, eval=True)
    eval_parameters(X_train, y_train)

image = mpimg.imread('bbox-example-image.jpg') draw_image = np.copy(image)

Uncomment the following line if you extracted training

data from .png images (scaled 0 to 1 by mpimg) and the

image you are searching is a .jpg (scaled 0 to 255)

if TRAINING_IMAGE_SUFFIX == IMAGE_SUFFIX_PNG: image = image.astype(np.float32)/255

windows = slide_window(image, x_start_stop=[None, None], y_start_stop=y_start_stop, xy_window=(96, 96), xy_overlap=(0.5, 0.5))

hot_windows = search_windows(image, windows, svc, X_scaler, color_space=color_space, spatial_size=spatial_size, hist_bins=hist_bins, orient=orient, pix_per_cell=pix_per_cell, cell_per_block=cell_per_block, hog_channel=hog_channel, spatial_feat=spatial_feat, hist_feat=hist_feat, hog_feat=hog_feat)

print(hot_windows)

window_img = draw_boxes(draw_image, hot_windows, color=(0, 0, 255), thick=6)

plt.imshow(window_img)

In [38]:
def prit_parameters(color_space, 
                        spatial_size, hist_bins, 
                        orient, pix_per_cell, 
                        cell_per_block,
                        hog_channel, spatial_feat, 
                        hist_feat, hog_feat):
    print("color_space",color_space) 

    print("hist_bins",hist_bins) 
    print("orient",orient)
    print("pix_per_cell",pix_per_cell) 
    print("cell_per_block",cell_per_block)
    print("hog_channel",hog_channel) 
    print("spatial_feat",spatial_feat) 
    print("spatial_size",spatial_size)
    print("hist_feat",hist_feat)
    print("hog_feat",hog_feat)
In [39]:
def print_global_variables():
    print("color_space",color_space) 

    print("orient",orient) 

    print("pix_per_cell",pix_per_cell) 
    print("cell_per_block",cell_per_block)
 
    #print("spatial_feat",spatial_feat) 
    #print("spatial_size",spatial_size)
    
    #print("hist_feat",hist_feat)
    #print("hist_bins",hist_bins) 
   
    
    #print("hog_feat",hog_feat)
    #print("hog_channel",hog_channel)
    
    #print("scale", scale)
In [40]:
color_space = "RGB"
print_global_variables()

SIZE_RANGES = (64, 128, 256)
Y_END_RATES = (0.7, 0.8, 1)
XY_OVERLAP = (0.7, 0.7)

image = mpimg.imread('test_images/test4.jpg')
draw_image = np.copy(image)


svc = svc
X_scaler = X_scaler

# Uncomment the following line if you extracted training
# data from .png images (scaled 0 to 1 by mpimg) and the
# image you are searching is a .jpg (scaled 0 to 255)
if TRAINING_IMAGE_SUFFIX == IMAGE_SUFFIX_PNG:
    image = image.astype(np.float32)/255

#print(image)
x_start_stop = [None, None]
y_start_stop = [image.shape[0]//2, image.shape[0]]

windows = []
for y_end, xysize in zip(Y_END_RATES, SIZE_RANGES):
    size = (xysize, xysize)
    y_start_stop = [image.shape[0]//2, int(y_end*image.shape[0])]
    windows.extend(slide_window(image, x_start_stop=x_start_stop, y_start_stop=y_start_stop, 
                    xy_window=size, xy_overlap=XY_OVERLAP))

    print(size, y_start_stop)

#hot_windows = search_windows(image, windows, svc, X_scaler, color_space=color_space)#, 
                        #spatial_size=spatial_size, hist_bins=hist_bins, 
                        #orient=orient, pix_per_cell=pix_per_cell, 
                        #cell_per_block=cell_per_block,
                        #hog_channel=hog_channel, spatial_feat=spatial_feat, 
                        #hist_feat=hist_feat, hog_feat=hog_feat)  
"""
prit_parameters(color_space=color_space, 
                        spatial_size=spatial_size, hist_bins=hist_bins, 
                        orient=orient, pix_per_cell=pix_per_cell, 
                        cell_per_block=cell_per_block,
                        hog_channel=hog_channel, spatial_feat=spatial_feat, 
                        hist_feat=hist_feat, hog_feat=hog_feat)
"""

#window_img = draw_boxes(draw_image, hot_windows, color=(0, 0, 255), thick=6)                    

#plt.imshow(window_img)
color_space RGB
orient 9
pix_per_cell 8
cell_per_block 2
(64, 64) [360, 503]
(128, 128) [360, 576]
(256, 256) [360, 720]
Out[40]:
'\nprit_parameters(color_space=color_space, \n                        spatial_size=spatial_size, hist_bins=hist_bins, \n                        orient=orient, pix_per_cell=pix_per_cell, \n                        cell_per_block=cell_per_block,\n                        hog_channel=hog_channel, spatial_feat=spatial_feat, \n                        hist_feat=hist_feat, hog_feat=hog_feat)\n'

Multiple Detections & False Positives

In [41]:
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import numpy as np
import cv2
from scipy.ndimage.measurements import label

def add_heat(heatmap, bbox_list):
    # Iterate through list of bboxes
    for box in bbox_list:
        # Add += 1 for all pixels inside each bbox
        # Assuming each "box" takes the form ((x1, y1), (x2, y2))
        heatmap[box[0][1]:box[1][1], box[0][0]:box[1][0]] += 1

    # Return updated heatmap
    return heatmap# Iterate through list of bboxes
    
def apply_threshold(heatmap, threshold):
    # Zero out pixels below the threshold
    heatmap[heatmap <= threshold] = 0
    # Return thresholded map
    return heatmap

def draw_labeled_bboxes(img, labels):
    # Iterate through all detected cars
    for car_number in range(1, labels[1]+1):
        # Find pixels with each car_number label value
        nonzero = (labels[0] == car_number).nonzero()
        # Identify x and y values of those pixels
        nonzeroy = np.array(nonzero[0])
        nonzerox = np.array(nonzero[1])
        # Define a bounding box based on min/max x and y
        bbox = ((np.min(nonzerox), np.min(nonzeroy)), (np.max(nonzerox), np.max(nonzeroy)))
        # Draw the box on the image
        cv2.rectangle(img, bbox[0], bbox[1], (0,0,255), 6)
    # Return the image
    return img

Heat Map

In [42]:
color_space ='HSV'
spatial_size= (16,16)
hist_bins=16
orient=9
pix_per_cell=8 
cell_per_block=2
hog_channel="ALL"
spatial_feat=True
hist_feat=True
hog_feat=True
In [43]:
# Read in image similar to one shown above 
#image = mpimg.imread("bbox-example-image.jpg")#('test_image.jpg')
image = mpimg.imread('test_images/test4.jpg')
draw_image = np.copy(image)

# Uncomment the following line if you extracted training
# data from .png images (scaled 0 to 1 by mpimg) and the
# image you are searching is a .jpg (scaled 0 to 255)
search_image = np.copy(image)
if TRAINING_IMAGE_SUFFIX == IMAGE_SUFFIX_PNG:
    print("image was modified.")
    search_image = search_image.astype(np.float32)/255

x_start_stop = [None, None]
y_start_stop = [image.shape[0]//2, image.shape[0]]

windows = []
for y_end, xysize in zip(Y_END_RATES, SIZE_RANGES):
    size = (xysize, xysize)
    y_start_stop = [image.shape[0]//2, int(y_end*image.shape[0])]
    windows.extend(slide_window(image, x_start_stop=x_start_stop, y_start_stop=y_start_stop, 
                    xy_window=size, xy_overlap=XY_OVERLAP))

    print(size, y_start_stop)

hot_windows = search_windows(search_image, windows, svc, X_scaler, color_space=color_space, 
                        spatial_size=spatial_size, hist_bins=hist_bins, 
                        orient=orient, pix_per_cell=pix_per_cell, 
                        cell_per_block=cell_per_block,
                        hog_channel=hog_channel, spatial_feat=spatial_feat, 
                        hist_feat=hist_feat, hog_feat=hog_feat)  

window_img = draw_boxes(draw_image, hot_windows, color=(0, 0, 255), thick=6)                    

plt.imshow(window_img)

heat = np.zeros_like(image[:,:,0]).astype(np.float)


# Add heat to each box in box list
heat = add_heat(heat,hot_windows)#ox_list)

#print(heat)
    
# Apply threshold to help remove false positives
heat = apply_threshold(heat,1)

# Visualize the heatmap when displaying    
heatmap = np.clip(heat, 0, 255)

# Find final boxes from heatmap using label function
labels = label(heatmap)
draw_img = draw_labeled_bboxes(np.copy(image), labels)

fig = plt.figure()
plt.subplot(121)
plt.imshow(draw_img)
plt.title('Car Positions')
plt.subplot(122)
plt.imshow(heatmap, cmap='hot')
plt.title('Heat Map')
fig.tight_layout()
image was modified.
(64, 64) [360, 503]
(128, 128) [360, 576]
(256, 256) [360, 720]
C:\Anaconda3\envs\carnd-term1\lib\site-packages\skimage\feature\_hog.py:119: skimage_deprecation: Default value of `block_norm`==`L1` is deprecated and will be changed to `L2-Hys` in v0.15
  'be changed to `L2-Hys` in v0.15', skimage_deprecation)
In [44]:
def process_search(image, viz=False):
    search_image = np.copy(image)
    if TRAINING_IMAGE_SUFFIX == IMAGE_SUFFIX_PNG:
        search_image = search_image.astype(np.float32)/255
    
    hot_windows = search_windows(search_image, windows, svc, X_scaler, color_space=color_space, 
                        spatial_size=spatial_size, hist_bins=hist_bins, 
                        orient=orient, pix_per_cell=pix_per_cell, 
                        cell_per_block=cell_per_block,
                        hog_channel=hog_channel, spatial_feat=spatial_feat, 
                        hist_feat=hist_feat, hog_feat=hog_feat)  
    # ignore heatmap
    draw_img = draw_boxes(image, hot_windows, color=(0, 0, 255), thick=6) 
    if viz == True:
        fig = plt.figure()
        plt.subplot(121)
        plt.imshow(draw_img)
        plt.title('Car Positions')
        fig.tight_layout()
    return draw_img

# Assuming Global Variables: windows, svc, X_scaler
# and heatmaps
import collections
heatmaps = collections.deque(maxlen=14)
def process_heatmap(image, threshold=3, viz=False):
    search_image = np.copy(image)
    if TRAINING_IMAGE_SUFFIX == IMAGE_SUFFIX_PNG:
        search_image = search_image.astype(np.float32)/255
    
    hot_windows = search_windows(search_image, windows, svc, X_scaler, color_space=color_space, 
                        spatial_size=spatial_size, hist_bins=hist_bins, 
                        orient=orient, pix_per_cell=pix_per_cell, 
                        cell_per_block=cell_per_block,
                        hog_channel=hog_channel, spatial_feat=spatial_feat, 
                        hist_feat=hist_feat, hog_feat=hog_feat)  

    #draw_img = np.copy(image)
    heat = np.zeros_like(image[:,:,0]).astype(np.float)
    # Add heat to each box in box list
    heat = add_heat(heat,hot_windows)
    
    # Use deque 
    #heatmaps.append(heat)
    #heatmap_sum = sum(heatmaps)
    #thresh_heat = apply_threshold(heatmap_sum, threshold)
    if heatmaps == None:
        # Apply threshold to help remove false positives
        thresh_heat = apply_threshold(heat,threshold)
    else:
        if heatmaps.maxlen == 1:
            thresh_heat = apply_threshold(heat,threshold)
        else:
            heatmaps.append(heat)
            heatmap_sum = sum(heatmaps)
            thresh_heat = apply_threshold(heatmap_sum, threshold)

    labels = label(thresh_heat)
    # Apply threshold to help remove false positives
    #heat = apply_threshold(heat,threshold)
    thresh_heat = apply_threshold(heat,threshold)

    # Visualize the heatmap when displaying    
    heatmap = np.clip(heat, 0, 255)

    # Find final boxes from heatmap using label function
    #labels = label(heatmap)
    labels = label(thresh_heat)
    draw_img = draw_labeled_bboxes(np.copy(image), labels)
    
    if viz == True:
        fig = plt.figure()
        plt.subplot(121)
        plt.imshow(draw_img)
        plt.title('Car Positions')
        plt.subplot(122)
        plt.imshow(heatmap, cmap='hot')
        plt.title('Heat Map {}'.format(threshold))
        fig.tight_layout()

    return draw_img
In [45]:
image = mpimg.imread('test_images/test4.jpg')

draw_img = process_heatmap(image, 0.5, viz=True)
draw_img = process_heatmap(image, 1, viz=True)
draw_img = process_heatmap(image, 1.5, viz=True)
draw_img = process_heatmap(image, 2, viz=True)
#draw_img = process_heatmap(image, 3, viz=True)
#draw_img = process_heatmap(image, 4, viz=True)
#draw_img = process_search(image, viz=True)
C:\Anaconda3\envs\carnd-term1\lib\site-packages\skimage\feature\_hog.py:119: skimage_deprecation: Default value of `block_norm`==`L1` is deprecated and will be changed to `L2-Hys` in v0.15
  'be changed to `L2-Hys` in v0.15', skimage_deprecation)
In [47]:
image = mpimg.imread('target_images/black_car_large.jpg')
        
draw_img = process_heatmap(image, 0.5, viz=True)
draw_img = process_heatmap(image, 1, viz=True)
draw_img = process_heatmap(image, 1.5, viz=True)
#draw_img = process_heatmap(image, 2, viz=True)
#draw_img = process_heatmap(image, 3, viz=True)
#draw_img = process_search(image)
C:\Anaconda3\envs\carnd-term1\lib\site-packages\skimage\feature\_hog.py:119: skimage_deprecation: Default value of `block_norm`==`L1` is deprecated and will be changed to `L2-Hys` in v0.15
  'be changed to `L2-Hys` in v0.15', skimage_deprecation)
In [48]:
image = mpimg.imread('target_images/white_car_small.jpg')
        
draw_img = process_heatmap(image, 0.5, viz=True)
draw_img = process_heatmap(image, 1, viz=True)
draw_img = process_heatmap(image, 1.5, viz=True)
#draw_img = process_heatmap(image, 2, viz=True)
#draw_img = process_heatmap(image, 3, viz=True)
#draw_img = process_heatmap(image, 4, viz=True)
#draw_img = process_search(image)
C:\Anaconda3\envs\carnd-term1\lib\site-packages\skimage\feature\_hog.py:119: skimage_deprecation: Default value of `block_norm`==`L1` is deprecated and will be changed to `L2-Hys` in v0.15
  'be changed to `L2-Hys` in v0.15', skimage_deprecation)

End of Preparation

-------------------------------------------------------------------

Hog_subsample.py

In [50]:
def show_two_images(img1, img2, title1="Original Image", title2="Result Image"):

    f, (ax1, ax2) = plt.subplots(1, 2, figsize=(24, 9))
    f.tight_layout()
    ax1.imshow(img1)
    ax1.set_title(title1, fontsize=50)
    ax2.imshow(img2)
    ax2.set_title(title2, fontsize=50)
    plt.subplots_adjust(left=0., right=1, top=0.9, bottom=0.)
In [51]:
# Define a single function that can extract features using hog sub-sampling and make predictions
def find_cars(img, ystart, ystop, scale, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins, viz=False):
    
    draw_img = np.copy(img)
    if TRAINING_IMAGE_SUFFIX == IMAGE_SUFFIX_PNG:
        #search_image = search_image.astype(np.float32)/255
        img = img.astype(np.float32)/255
    
    img_tosearch = img[ystart:ystop,:,:]

    if viz == True:
        print("len(img_tosearch)",len(img_tosearch))
        print("len(draw_img)",len(draw_img))
        plt.imshow(img_tosearch)
    
        
    ctrans_tosearch = convert_color(img_tosearch, color_space=color_space)
    if scale != 1:
        imshape = ctrans_tosearch.shape
        ctrans_tosearch = cv2.resize(ctrans_tosearch, (np.int(imshape[1]/scale), np.int(imshape[0]/scale)))

    if viz == True:
        print("len(ctrans_tosearch)",len(ctrans_tosearch))
        plt.imshow(ctrans_tosearch)

    ch1 = ctrans_tosearch[:,:,0]
    ch2 = ctrans_tosearch[:,:,1]
    ch3 = ctrans_tosearch[:,:,2]

    # Define blocks and steps as above
    nxblocks = (ch1.shape[1] // pix_per_cell) - cell_per_block + 1
    nyblocks = (ch1.shape[0] // pix_per_cell) - cell_per_block + 1 
    nfeat_per_block = orient*cell_per_block**2
    
    # 64 was the orginal sampling rate, with 8 cells and 8 pix per cell
    window = 64
    nblocks_per_window = (window // pix_per_cell) - cell_per_block + 1
    cells_per_step = 2  # Instead of overlap, define how many cells to step
    nxsteps = (nxblocks - nblocks_per_window) // cells_per_step
    nysteps = (nyblocks - nblocks_per_window) // cells_per_step
    
    # Compute individual channel HOG features for the entire image
    hog1 = get_hog_features(ch1, orient, pix_per_cell, cell_per_block, feature_vec=False)
    hog2 = get_hog_features(ch2, orient, pix_per_cell, cell_per_block, feature_vec=False)
    hog3 = get_hog_features(ch3, orient, pix_per_cell, cell_per_block, feature_vec=False)
    
    for xb in range(nxsteps):
        for yb in range(nysteps):
            ypos = yb*cells_per_step
            xpos = xb*cells_per_step
            # Extract HOG for this patch
            hog_feat1 = hog1[ypos:ypos+nblocks_per_window, xpos:xpos+nblocks_per_window].ravel() 
            hog_feat2 = hog2[ypos:ypos+nblocks_per_window, xpos:xpos+nblocks_per_window].ravel() 
            hog_feat3 = hog3[ypos:ypos+nblocks_per_window, xpos:xpos+nblocks_per_window].ravel() 
            hog_features = np.hstack((hog_feat1, hog_feat2, hog_feat3))

            xleft = xpos*pix_per_cell
            ytop = ypos*pix_per_cell

            # Extract the image patch
            subimg = cv2.resize(ctrans_tosearch[ytop:ytop+window, xleft:xleft+window], (64,64))
          
            # Get color features
            spatial_features = bin_spatial(subimg, size=spatial_size)
            hist_features = color_hist(subimg, nbins=hist_bins)

            # Scale features and make a prediction
            test_features = X_scaler.transform(np.hstack((spatial_features, hist_features, hog_features)).reshape(1, -1))    
            #test_features = X_scaler.transform(np.hstack((shape_feat, hist_feat)).reshape(1, -1))    
            test_prediction = svc.predict(test_features)
            
            if test_prediction == 1:
                xbox_left = np.int(xleft*scale)
                ytop_draw = np.int(ytop*scale)
                win_draw = np.int(window*scale)
                cv2.rectangle(draw_img,(xbox_left, ytop_draw+ystart),(xbox_left+win_draw,ytop_draw+win_draw+ystart),(0,0,255),6) 
                
    return draw_img
In [72]:
# Define a single function that can extract features using hog sub-sampling and make predictions
def process_find_cars(img, ystart, ystop, scale, svc, X_scaler, color_space, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins, viz=False):
    
    draw_img = np.copy(img)
    if TRAINING_IMAGE_SUFFIX == IMAGE_SUFFIX_PNG:
        #search_image = search_image.astype(np.float32)/255
        img = img.astype(np.float32)/255
    img_tosearch = np.copy(img) 
    img_tosearch = img[ystart:ystop,:,:]
    #if viz == True:
    #    print("len(img_tosearch)",len(img_tosearch))
    #    print("len(draw_img)",len(draw_img))
    #    show_two_images(draw_img, img_tosearch)

    #ctrans_tosearch = convert_color(img_tosearch, conv='RGB2YCrCb')#
    #2) Apply color conversion if other than 'RGB'
    ctrans_tosearch = convert_color(img_tosearch, color_space=color_space)


    if scale != 1:
        imshape = ctrans_tosearch.shape
        ctrans_tosearch = cv2.resize(ctrans_tosearch, (np.int(imshape[1]/scale), np.int(imshape[0]/scale)))

    if viz == True:
        show_two_images(draw_img, ctrans_tosearch)
        
    ch1 = ctrans_tosearch[:,:,0]
    ch2 = ctrans_tosearch[:,:,1]
    ch3 = ctrans_tosearch[:,:,2]

    # Define blocks and steps as above
    nxblocks = (ch1.shape[1] // pix_per_cell) - cell_per_block + 1
    nyblocks = (ch1.shape[0] // pix_per_cell) - cell_per_block + 1 
    nfeat_per_block = orient*cell_per_block**2
    
    # 64 was the orginal sampling rate, with 8 cells and 8 pix per cell
    window = 64
    nblocks_per_window = (window // pix_per_cell) - cell_per_block + 1
    cells_per_step = 2  # Instead of overlap, define how many cells to step
    nxsteps = (nxblocks - nblocks_per_window) // cells_per_step
    nysteps = (nyblocks - nblocks_per_window) // cells_per_step
    
    # Compute individual channel HOG features for the entire image
    hog1 = get_hog_features(ch1, orient, pix_per_cell, cell_per_block, feature_vec=False)
    hog2 = get_hog_features(ch2, orient, pix_per_cell, cell_per_block, feature_vec=False)
    hog3 = get_hog_features(ch3, orient, pix_per_cell, cell_per_block, feature_vec=False)
    
    #1) Create an empty list to receive positive detection windows
    on_windows = []
    #2) Iterate over all windows in the list
    for xb in range(nxsteps):
        for yb in range(nysteps):
            ypos = yb*cells_per_step
            xpos = xb*cells_per_step
            # Extract HOG for this patch
            hog_feat1 = hog1[ypos:ypos+nblocks_per_window, xpos:xpos+nblocks_per_window].ravel() 
            hog_feat2 = hog2[ypos:ypos+nblocks_per_window, xpos:xpos+nblocks_per_window].ravel() 
            hog_feat3 = hog3[ypos:ypos+nblocks_per_window, xpos:xpos+nblocks_per_window].ravel() 
            hog_features = np.hstack((hog_feat1, hog_feat2, hog_feat3))

            xleft = xpos*pix_per_cell
            ytop = ypos*pix_per_cell

            #3) Extract the test window from original image
            # Extract the image patch
            subimg = cv2.resize(ctrans_tosearch[ytop:ytop+window, xleft:xleft+window], (64,64))
          
            #4) Extract features for that window NOT using single_img_features() but hog, and spatial and hist separately
            
            # Get color features
            spatial_features = bin_spatial(subimg, size=spatial_size)
            hist_features = color_hist(subimg, nbins=hist_bins)
            
            
            #5) Scale extracted features to be fed to classifier
            # Scale features and make a prediction
            test_features = X_scaler.transform(np.hstack((spatial_features, hist_features, hog_features)).reshape(1, -1))    
            #test_features = X_scaler.transform(np.hstack((shape_feat, hist_feat)).reshape(1, -1))   
            
            #6) Predict using your classifier
            test_prediction = svc.predict(test_features)
            
            #7) If positive (prediction == 1) then save the window
            if test_prediction == 1:
                xbox_left = np.int(xleft*scale)
                ytop_draw = np.int(ytop*scale)
                win_draw = np.int(window*scale)
                    
                if viz == True:
                    cv2.rectangle(draw_img,(xbox_left, ytop_draw+ystart),(xbox_left+win_draw,ytop_draw+win_draw+ystart),(0,0,255),6) 
                
                # Calculate window position
                startx = xbox_left
                starty = ytop_draw+ystart
                
                endx = xbox_left+win_draw
                endy = ytop_draw+win_draw+ystart

                on_windows.append(((startx, starty), (endx, endy)))
    
    #8) Return windows for positive detections
    #if viz == True:
        #show_two_images(img, draw_img)
        
    return on_windows            
    #return draw_img
In [73]:
# Assuming Global Variables: windows, svc, X_scaler
# and heatmaps
import collections
heatmaps = collections.deque(maxlen=14)
def process_heatmap_hog_sub_sample(image, config, threshold, scale, viz=False):
    
    #config.hog_channel="ALL", 
    #config.spatial_feat=True, 
    #config.hist_feat=True
    #config.hog_feat=True
    
    #ystart, ystop, svc, X_scaler,

    color_space = config.color_space
    orient = config.orient 
    pix_per_cell = config.pix_per_cell
    cell_per_block = config.cell_per_block 
    spatial_size = config.spatial_size 
    hist_bins = config.hist_bins
    
    search_image = np.copy(image)
    if TRAINING_IMAGE_SUFFIX == IMAGE_SUFFIX_PNG:
        search_image = search_image.astype(np.float32)/255
    
    hot_windows = process_find_cars(image, ystart, ystop, scale, svc, X_scaler, color_space, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins, viz)
    
    #draw_img = np.copy(image)
    heat = np.zeros_like(image[:,:,0]).astype(np.float)

    # Add heat to each box in box list
    heat = add_heat(heat,hot_windows)

    # Use deque 
    if heatmaps == None:
        # Apply threshold to help remove false positives
        heat = apply_threshold(heat,threshold)
    else:
        if heatmaps.maxlen == 1:
            heat = apply_threshold(heat,threshold)
        else:
            heatmaps.append(heat)
            heatmap_sum = sum(heatmaps)
            heat = apply_threshold(heatmap_sum, threshold)
        

    # Visualize the heatmap when displaying    
    heatmap = np.clip(heat, 0, 255)

    # Find final boxes from heatmap using label function
    labels = label(heatmap)
    draw_img = draw_labeled_bboxes(np.copy(image), labels)
    
    if viz == True:        
        draw_img = draw_boxes(np.copy(draw_img), hot_windows, color=(0, 255,0), thick=2)
        
        fig = plt.figure()
        plt.subplot(121)
        plt.imshow(draw_img)
        plt.title('Car Positions (scale:{})'.format(scale))
        plt.subplot(122)
        plt.imshow(heatmap, cmap='hot')
        plt.title('Heat Map (thres:{})'.format(threshold))
        fig.tight_layout()
        

    return draw_img
In [145]:
def process_heatmap_hog_sub_sample_w_scales(image, config, threshold, scales, ystart, ystop, vis=False):

    color_space = config.color_space
    orient = config.orient 
    pix_per_cell = config.pix_per_cell
    cell_per_block = config.cell_per_block 
    spatial_size = config.spatial_size 
    hist_bins = config.hist_bins
    
    search_image = np.copy(image)
    if TRAINING_IMAGE_SUFFIX == IMAGE_SUFFIX_PNG:
        search_image = search_image.astype(np.float32)/255
    
    hot_windows = []

    devides = len(scales)
    devide_heights = (ystop - ystart)//devides
    for i in range(devides):
        start_y = ystart# + devide_heights *(i)
        stop_y = start_y + devide_heights*(i+1)#devide_heights
        if vis == True: 
            print("iteration",i)
            print("start_y",start_y)
            print("stop_y",stop_y)
        on_windows = process_find_cars(image, start_y, stop_y, scales[i], svc, X_scaler, color_space, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins, vis)
        hot_windows.extend(on_windows)
        
    #draw_img = np.copy(image)
    heat = np.zeros_like(image[:,:,0]).astype(np.float)

    # Add heat to each box in box list
    heat = add_heat(heat,hot_windows)

    # Use deque 
    if heatmaps == None:
        # Apply threshold to help remove false positives
        heat = apply_threshold(heat,threshold)
    else:
        if heatmaps.maxlen == 1:
            heat = apply_threshold(heat,threshold)
        else:
            heatmaps.append(heat)
            heatmap_sum = sum(heatmaps)
            heat = apply_threshold(heatmap_sum, threshold)
        

    # Visualize the heatmap when displaying    
    heatmap = np.clip(heat, 0, 255)

    # Find final boxes from heatmap using label function
    labels = label(heatmap)
    draw_img = draw_labeled_bboxes(np.copy(image), labels)
    
    if vis == True:        
        draw_img = draw_boxes(np.copy(draw_img), hot_windows, color=(0, 255,0), thick=2)
        
        fig = plt.figure()
        plt.subplot(121)
        plt.imshow(draw_img)
        plt.title('Car Positions (scale:{})'.format(scales))
        plt.subplot(122)
        plt.imshow(heatmap, cmap='hot')
        plt.title('Heat Map (thres:{})'.format(threshold))
        fig.tight_layout()
        

    return draw_img
In [110]:
img = mpimg.imread("./test_images/test1.jpg")

ystart = img.shape[0]//2
ystop = img.shape[0]

#print(ystart, ystop)

ystart = 400
ystop = 656
scale = 2#1.5#1.5
    
#out_img = find_cars(img, ystart, ystop, scale, svc, X_scaler, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins, viz=True)
#def process_find_cars(img, ystart, ystop, scale, svc, X_scaler, color_space, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins, viz=False):

_ = process_find_cars(img, ystart, ystop, scale, svc, X_scaler, color_space, orient, pix_per_cell, cell_per_block, spatial_size, hist_bins, viz=True)

#plt.imshow(out_img)
In [111]:
image = mpimg.imread('test_images/test1.jpg')

t=time.time()

heatmaps = collections.deque(maxlen=1)
draw_img = process_heatmap_hog_sub_sample(image, config, threshold=0.5, scale=2, viz=True)
#draw_img = process_search(image)
heatmaps = None

t2 = time.time()
print(round(t2-t, 2), 'Seconds to process a frame...')
0.67 Seconds to process a frame...
In [112]:
image = mpimg.imread('test_images/test1.jpg')

t=time.time()

heatmaps = collections.deque(maxlen=1)

scales = [1]
threshold=0.5
process_heatmap_hog_sub_sample_w_scales(image, config, threshold, scales, ystart, ystop, vis=True)

heatmaps = None

t2 = time.time()
print(round(t2-t, 2), 'Seconds to process a frame...')
1.57 Seconds to process a frame...

Parameter Tuning

In [56]:
heatmaps = collections.deque(maxlen=1)
def try_process_heatmap_hog_sub_sample(image, config, threshold, scale):
    t=time.time()
    draw_img = process_heatmap_hog_sub_sample(image, config, threshold, scale, viz=True)
    #draw_img = process_search(image) 
    t2 = time.time()
    print(round(t2-t, 2), 'Seconds to process a frame...')
In [113]:
heatmaps = collections.deque(maxlen=1)
def try_process_heatmap_hog_sub_sample_w_scales(image, config, threshold, scales):
    t=time.time()
    draw_img = process_heatmap_hog_sub_sample_w_scales(image, config, threshold, scales, ystart, ystop, vis=True)
    #draw_img = process_search(image) 
    t2 = time.time()
    print(round(t2-t, 2), 'Seconds to process a frame...')
In [57]:
image = mpimg.imread('issue_images/org_video_image_20171229_07_41_59.jpg')
heatmaps = None
try_process_heatmap_hog_sub_sample(image, config, threshold=0.5, scale=0.9)
try_process_heatmap_hog_sub_sample(image, config, threshold=0.5, scale=1)
try_process_heatmap_hog_sub_sample(image, config, threshold=0.5, scale=1.5)
try_process_heatmap_hog_sub_sample(image, config, threshold=0.5, scale=2)
C:\Anaconda3\envs\carnd-term1\lib\site-packages\skimage\feature\_hog.py:119: skimage_deprecation: Default value of `block_norm`==`L1` is deprecated and will be changed to `L2-Hys` in v0.15
  'be changed to `L2-Hys` in v0.15', skimage_deprecation)
1.53 Seconds to process a frame...
1.07 Seconds to process a frame...
0.67 Seconds to process a frame...
0.39 Seconds to process a frame...
In [124]:
image = mpimg.imread('issue_images/org_video_image_20171229_07_41_59.jpg')
heatmaps = None
try_process_heatmap_hog_sub_sample_w_scales(image, config, threshold=0.5, scales=[0.9, 2])
i 0
start_y 400
stop_y 528
i 1
start_y 400
stop_y 656
1.2 Seconds to process a frame...
In [58]:
image = mpimg.imread('issue_images/org_video_image_20171229_07_44_15.jpg')

heatmaps = None
try_process_heatmap_hog_sub_sample(image, config, threshold=0.5, scale=0.9)
try_process_heatmap_hog_sub_sample(image, config, threshold=0.5, scale=1)
try_process_heatmap_hog_sub_sample(image, config, threshold=0.5, scale=1.5)
try_process_heatmap_hog_sub_sample(image, config, threshold=0.5, scale=2)

try_process_heatmap_hog_sub_sample(image, config, threshold=0.9, scale=0.9)
try_process_heatmap_hog_sub_sample(image, config, threshold=0.9, scale=1)
try_process_heatmap_hog_sub_sample(image, config, threshold=0.9, scale=1.5)
try_process_heatmap_hog_sub_sample(image, config, threshold=0.9, scale=2)
C:\Anaconda3\envs\carnd-term1\lib\site-packages\skimage\feature\_hog.py:119: skimage_deprecation: Default value of `block_norm`==`L1` is deprecated and will be changed to `L2-Hys` in v0.15
  'be changed to `L2-Hys` in v0.15', skimage_deprecation)
1.33 Seconds to process a frame...
1.31 Seconds to process a frame...
0.55 Seconds to process a frame...
0.38 Seconds to process a frame...
1.3 Seconds to process a frame...
1.05 Seconds to process a frame...
0.53 Seconds to process a frame...
0.39 Seconds to process a frame...
In [59]:
image = mpimg.imread('issue_images/org_video_image_20171229_07_40_21.jpg')

heatmaps = None
try_process_heatmap_hog_sub_sample(image, config, threshold=0.5, scale=0.9)
try_process_heatmap_hog_sub_sample(image, config, threshold=0.9, scale=0.9)

try_process_heatmap_hog_sub_sample(image, config, threshold=0.5, scale=1)
try_process_heatmap_hog_sub_sample(image, config, threshold=0.9, scale=1)

try_process_heatmap_hog_sub_sample(image, config, threshold=0.5, scale=1.5)
try_process_heatmap_hog_sub_sample(image, config, threshold=0.9, scale=1.5)

try_process_heatmap_hog_sub_sample(image, config, threshold=0.5, scale=2)
try_process_heatmap_hog_sub_sample(image, config, threshold=0.9, scale=2)
C:\Anaconda3\envs\carnd-term1\lib\site-packages\skimage\feature\_hog.py:119: skimage_deprecation: Default value of `block_norm`==`L1` is deprecated and will be changed to `L2-Hys` in v0.15
  'be changed to `L2-Hys` in v0.15', skimage_deprecation)
1.46 Seconds to process a frame...
1.18 Seconds to process a frame...
1.01 Seconds to process a frame...
1.28 Seconds to process a frame...
0.53 Seconds to process a frame...
0.52 Seconds to process a frame...
0.45 Seconds to process a frame...
0.39 Seconds to process a frame...

Video Implementation

Here's a link to my video result

2. Describe how (and identify where in your code) you implemented some kind of filter for false positives and some method for combining overlapping bounding boxes.

I recorded the positions of positive detections in each frame of the video. From the positive detections I created a heatmap and then thresholded that map to identify vehicle positions. I then used scipy.ndimage.measurements.label() to identify individual blobs in the heatmap. I then assumed each blob corresponded to a vehicle. I constructed bounding boxes to cover the area of each blob detected.

Here's an example result showing the heatmap from a series of frames of video, the result of scipy.ndimage.measurements.label() and the bounding boxes then overlaid on the last frame of video:

Here are six frames and their corresponding heatmaps:

![alt text][image5]

Here is the output of scipy.ndimage.measurements.label() on the integrated heatmap from all six frames:

![alt text][image6]

Here the resulting bounding boxes are drawn onto the last frame in the series:

![alt text][image7]

In [60]:
DIR_ORG_VIDEO_SHOT = "./video_images/"
DIR_CVT_VIDEO_SHOT = "./converted_images/"
ORG_VIDEO_FILE_NAME = "org_video_image_"
CVT_VIDEO_FILE_NAME = "cvt_video_image_"
from PIL import Image
def save_image(image, dirname, filename):
    """save a image file"""    
    filepath = dirname + filename + datetime.now().strftime("%Y%m%d_%H_%M_%S.jpg")
    if not os.path.exists(filepath) :
        Image.fromarray(image).save(filepath)
In [150]:
def video_pipeline(image):
    # NOTE: The output you return should be a color image (3 channel) for processing video below
    # TODO: put your pipeline here,
    # you should return the final output (image where lines are drawn on lanes)
    #result = process_heatmap_hog_sub_sample(image, config, threshold=video_threshold, scale=video_scale)
    result = process_heatmap_hog_sub_sample_w_scales(image, config, threshold=video_threshold, scales=video_scales,ystart=ystart, ystop=ystop)
    return result
In [151]:
# Import everything needed to edit/save/watch video clips
from moviepy.editor import VideoFileClip
from IPython.display import HTML
In [166]:
video_threshold=0.5
#video_scale=2#0.9
video_scales=[1.5,2]#[0.9,2]#0.9
video_que_maxlen=3#10#5#1#20#10#5#10
print(video_scales)
[1.5, 2]
In [167]:
VIDEO_INPUT = 'test_video.mp4'
VIDEO_OUTPUT = 'output_images/test_video_out_th{}_scale{}_que{}.mp4'.format(video_threshold, video_scales, video_que_maxlen)
In [170]:
VIDEO_INPUT = 'project_video.mp4'
VIDEO_OUTPUT = 'output_images/project_video_out_th{}_scale{}_que{}.mp4'.format(video_threshold, video_scales, video_que_maxlen)
In [171]:
#VIDEO_INPUT = 'project_video.mp4'
#VIDEO_OUTPUT = 'output_images/project_video_output.mp4'
## To speed up the testing process you may want to try your pipeline on a shorter subclip of the video
## To do so add .subclip(start_second,end_second) to the end of the line below
## Where start_second and end_second are integer values representing the start and end of the subclip
## You may also uncomment the following line for a subclip of the first 5 seconds
##clip1 = VideoFileClip("test_videos/solidWhiteRight.mp4").subclip(0,5)

print_global_variables()

clip1 = VideoFileClip(VIDEO_INPUT)

heatmaps = collections.deque(maxlen=video_que_maxlen)#10)#50)

white_clip = clip1.fl_image(video_pipeline)#NOTE: this function expects color images!!
%time white_clip.write_videofile(VIDEO_OUTPUT, audio=False)

heatmaps = None
color_space HSV
orient 9
pix_per_cell 8
cell_per_block 2
[MoviePy] >>>> Building video output_images/project_video_out_th0.5_scale[1.5, 2]_que3.mp4
[MoviePy] Writing video output_images/project_video_out_th0.5_scale[1.5, 2]_que3.mp4
  0%|                                                                                         | 0/1261 [00:00<?, ?it/s]
  0%|                                                                                 | 1/1261 [00:00<14:11,  1.48it/s]
  0%|▏                                                                                | 2/1261 [00:01<12:18,  1.70it/s]
  0%|▏                                                                                | 3/1261 [00:01<10:56,  1.92it/s]
  0%|▎                                                                                | 4/1261 [00:01<10:09,  2.06it/s]
  0%|▎                                                                                | 5/1261 [00:02<09:58,  2.10it/s]
  0%|▍                                                                                | 6/1261 [00:02<09:25,  2.22it/s]
  1%|▍                                                                                | 7/1261 [00:03<09:06,  2.30it/s]
  1%|▌                                                                                | 8/1261 [00:03<08:43,  2.39it/s]
  1%|▌                                                                                | 9/1261 [00:03<08:24,  2.48it/s]
  1%|▋                                                                               | 10/1261 [00:04<08:18,  2.51it/s]
  1%|▋                                                                               | 11/1261 [00:04<08:23,  2.48it/s]
  1%|▊                                                                               | 12/1261 [00:05<08:28,  2.46it/s]
  1%|▊                                                                               | 13/1261 [00:05<08:18,  2.50it/s]
  1%|▉                                                                               | 14/1261 [00:06<09:56,  2.09it/s]
  1%|▉                                                                               | 15/1261 [00:06<09:36,  2.16it/s]
  1%|█                                                                               | 16/1261 [00:06<09:06,  2.28it/s]
  1%|█                                                                               | 17/1261 [00:07<08:45,  2.37it/s]
  1%|█▏                                                                              | 18/1261 [00:07<08:31,  2.43it/s]
  2%|█▏                                                                              | 19/1261 [00:08<08:34,  2.42it/s]
  2%|█▎                                                                              | 20/1261 [00:08<08:23,  2.47it/s]
  2%|█▎                                                                              | 21/1261 [00:08<08:29,  2.43it/s]
  2%|█▍                                                                              | 22/1261 [00:09<08:32,  2.42it/s]
  2%|█▍                                                                              | 23/1261 [00:09<08:22,  2.46it/s]
  2%|█▌                                                                              | 24/1261 [00:10<08:19,  2.48it/s]
  2%|█▌                                                                              | 25/1261 [00:10<08:57,  2.30it/s]
  2%|█▋                                                                              | 26/1261 [00:11<08:55,  2.31it/s]
  2%|█▋                                                                              | 27/1261 [00:11<10:43,  1.92it/s]
  2%|█▊                                                                              | 28/1261 [00:12<09:59,  2.06it/s]
  2%|█▊                                                                              | 29/1261 [00:12<09:27,  2.17it/s]
  2%|█▉                                                                              | 30/1261 [00:12<09:18,  2.21it/s]
  2%|█▉                                                                              | 31/1261 [00:13<09:37,  2.13it/s]
  3%|██                                                                              | 32/1261 [00:13<09:39,  2.12it/s]
  3%|██                                                                              | 33/1261 [00:14<09:13,  2.22it/s]
  3%|██▏                                                                             | 34/1261 [00:14<08:49,  2.32it/s]
  3%|██▏                                                                             | 35/1261 [00:15<08:37,  2.37it/s]
  3%|██▎                                                                             | 36/1261 [00:15<08:27,  2.41it/s]
  3%|██▎                                                                             | 37/1261 [00:15<08:28,  2.41it/s]
  3%|██▍                                                                             | 38/1261 [00:16<08:25,  2.42it/s]
  3%|██▍                                                                             | 39/1261 [00:17<09:59,  2.04it/s]
  3%|██▌                                                                             | 40/1261 [00:17<10:17,  1.98it/s]
  3%|██▌                                                                             | 41/1261 [00:18<10:08,  2.00it/s]
  3%|██▋                                                                             | 42/1261 [00:18<09:49,  2.07it/s]
  3%|██▋                                                                             | 43/1261 [00:19<10:28,  1.94it/s]
  3%|██▊                                                                             | 44/1261 [00:19<09:54,  2.05it/s]
  4%|██▊                                                                             | 45/1261 [00:19<09:23,  2.16it/s]
  4%|██▉                                                                             | 46/1261 [00:20<09:08,  2.21it/s]
  4%|██▉                                                                             | 47/1261 [00:20<09:07,  2.22it/s]
  4%|███                                                                             | 48/1261 [00:21<09:06,  2.22it/s]
  4%|███                                                                             | 49/1261 [00:21<09:29,  2.13it/s]
  4%|███▏                                                                            | 50/1261 [00:22<09:22,  2.15it/s]
  4%|███▏                                                                            | 51/1261 [00:22<10:49,  1.86it/s]
  4%|███▎                                                                            | 52/1261 [00:23<10:03,  2.00it/s]
  4%|███▎                                                                            | 53/1261 [00:23<09:42,  2.07it/s]
  4%|███▍                                                                            | 54/1261 [00:24<09:29,  2.12it/s]
  4%|███▍                                                                            | 55/1261 [00:24<09:10,  2.19it/s]
  4%|███▌                                                                            | 56/1261 [00:25<09:04,  2.21it/s]
  5%|███▌                                                                            | 57/1261 [00:25<09:00,  2.23it/s]
  5%|███▋                                                                            | 58/1261 [00:26<09:03,  2.21it/s]
  5%|███▋                                                                            | 59/1261 [00:26<09:01,  2.22it/s]
  5%|███▊                                                                            | 60/1261 [00:26<08:58,  2.23it/s]
  5%|███▊                                                                            | 61/1261 [00:27<08:46,  2.28it/s]
  5%|███▉                                                                            | 62/1261 [00:27<08:39,  2.31it/s]
  5%|███▉                                                                            | 63/1261 [00:28<10:14,  1.95it/s]
  5%|████                                                                            | 64/1261 [00:28<09:53,  2.02it/s]
  5%|████                                                                            | 65/1261 [00:29<09:24,  2.12it/s]
  5%|████▏                                                                           | 66/1261 [00:29<09:10,  2.17it/s]
  5%|████▎                                                                           | 67/1261 [00:30<09:09,  2.17it/s]
  5%|████▎                                                                           | 68/1261 [00:30<09:07,  2.18it/s]
  5%|████▍                                                                           | 69/1261 [00:31<09:39,  2.06it/s]
  6%|████▍                                                                           | 70/1261 [00:31<09:30,  2.09it/s]
  6%|████▌                                                                           | 71/1261 [00:32<09:19,  2.13it/s]
  6%|████▌                                                                           | 72/1261 [00:32<09:09,  2.16it/s]
  6%|████▋                                                                           | 73/1261 [00:33<09:03,  2.19it/s]
  6%|████▋                                                                           | 74/1261 [00:33<09:23,  2.11it/s]
  6%|████▊                                                                           | 75/1261 [00:34<10:32,  1.87it/s]
  6%|████▊                                                                           | 76/1261 [00:34<09:46,  2.02it/s]
  6%|████▉                                                                           | 77/1261 [00:35<09:22,  2.10it/s]
  6%|████▉                                                                           | 78/1261 [00:35<09:13,  2.14it/s]
  6%|█████                                                                           | 79/1261 [00:35<08:59,  2.19it/s]
  6%|█████                                                                           | 80/1261 [00:36<08:43,  2.26it/s]
  6%|█████▏                                                                          | 81/1261 [00:36<08:32,  2.30it/s]
  7%|█████▏                                                                          | 82/1261 [00:37<08:34,  2.29it/s]
  7%|█████▎                                                                          | 83/1261 [00:37<08:41,  2.26it/s]
  7%|█████▎                                                                          | 84/1261 [00:38<08:44,  2.24it/s]
  7%|█████▍                                                                          | 85/1261 [00:38<08:44,  2.24it/s]
  7%|█████▍                                                                          | 86/1261 [00:38<08:45,  2.23it/s]
  7%|█████▌                                                                          | 87/1261 [00:39<10:26,  1.87it/s]
  7%|█████▌                                                                          | 88/1261 [00:40<09:49,  1.99it/s]
  7%|█████▋                                                                          | 89/1261 [00:40<09:29,  2.06it/s]
  7%|█████▋                                                                          | 90/1261 [00:41<09:06,  2.14it/s]
  7%|█████▊                                                                          | 91/1261 [00:41<08:56,  2.18it/s]
  7%|█████▊                                                                          | 92/1261 [00:41<08:48,  2.21it/s]
  7%|█████▉                                                                          | 93/1261 [00:42<08:39,  2.25it/s]
  7%|█████▉                                                                          | 94/1261 [00:42<08:52,  2.19it/s]
  8%|██████                                                                          | 95/1261 [00:43<09:00,  2.16it/s]
  8%|██████                                                                          | 96/1261 [00:43<09:13,  2.10it/s]
  8%|██████▏                                                                         | 97/1261 [00:44<09:15,  2.10it/s]
  8%|██████▏                                                                         | 98/1261 [00:44<09:58,  1.94it/s]
  8%|██████▎                                                                         | 99/1261 [00:45<10:42,  1.81it/s]
  8%|██████▎                                                                        | 100/1261 [00:45<10:01,  1.93it/s]
  8%|██████▎                                                                        | 101/1261 [00:46<09:41,  2.00it/s]
  8%|██████▍                                                                        | 102/1261 [00:46<09:09,  2.11it/s]
  8%|██████▍                                                                        | 103/1261 [00:47<08:49,  2.19it/s]
  8%|██████▌                                                                        | 104/1261 [00:47<08:46,  2.20it/s]
  8%|██████▌                                                                        | 105/1261 [00:48<08:30,  2.26it/s]
  8%|██████▋                                                                        | 106/1261 [00:48<08:21,  2.30it/s]
  8%|██████▋                                                                        | 107/1261 [00:48<08:28,  2.27it/s]
  9%|██████▊                                                                        | 108/1261 [00:49<08:18,  2.31it/s]
  9%|██████▊                                                                        | 109/1261 [00:49<08:22,  2.29it/s]
  9%|██████▉                                                                        | 110/1261 [00:50<08:17,  2.31it/s]
  9%|██████▉                                                                        | 111/1261 [00:50<09:43,  1.97it/s]
  9%|███████                                                                        | 112/1261 [00:51<09:08,  2.09it/s]
  9%|███████                                                                        | 113/1261 [00:51<08:50,  2.16it/s]
  9%|███████▏                                                                       | 114/1261 [00:52<09:30,  2.01it/s]
  9%|███████▏                                                                       | 115/1261 [00:52<09:13,  2.07it/s]
  9%|███████▎                                                                       | 116/1261 [00:53<08:59,  2.12it/s]
  9%|███████▎                                                                       | 117/1261 [00:53<09:12,  2.07it/s]
  9%|███████▍                                                                       | 118/1261 [00:54<08:54,  2.14it/s]
  9%|███████▍                                                                       | 119/1261 [00:54<08:36,  2.21it/s]
 10%|███████▌                                                                       | 120/1261 [00:55<08:37,  2.20it/s]
 10%|███████▌                                                                       | 121/1261 [00:55<08:23,  2.26it/s]
 10%|███████▋                                                                       | 122/1261 [00:56<09:42,  1.95it/s]
 10%|███████▋                                                                       | 123/1261 [00:56<10:25,  1.82it/s]
 10%|███████▊                                                                       | 124/1261 [00:57<09:50,  1.93it/s]
 10%|███████▊                                                                       | 125/1261 [00:57<09:17,  2.04it/s]
 10%|███████▉                                                                       | 126/1261 [00:58<09:03,  2.09it/s]
 10%|███████▉                                                                       | 127/1261 [00:58<08:41,  2.17it/s]
 10%|████████                                                                       | 128/1261 [00:58<08:31,  2.21it/s]
 10%|████████                                                                       | 129/1261 [00:59<08:16,  2.28it/s]
 10%|████████▏                                                                      | 130/1261 [00:59<08:10,  2.31it/s]
 10%|████████▏                                                                      | 131/1261 [01:00<08:03,  2.34it/s]
 10%|████████▎                                                                      | 132/1261 [01:00<08:11,  2.30it/s]
 11%|████████▎                                                                      | 133/1261 [01:01<08:03,  2.33it/s]
 11%|████████▍                                                                      | 134/1261 [01:01<07:57,  2.36it/s]
 11%|████████▍                                                                      | 135/1261 [01:02<09:34,  1.96it/s]
 11%|████████▌                                                                      | 136/1261 [01:02<09:04,  2.07it/s]
 11%|████████▌                                                                      | 137/1261 [01:03<08:44,  2.14it/s]
 11%|████████▋                                                                      | 138/1261 [01:03<08:29,  2.21it/s]
 11%|████████▋                                                                      | 139/1261 [01:03<08:16,  2.26it/s]
 11%|████████▊                                                                      | 140/1261 [01:04<08:17,  2.25it/s]
 11%|████████▊                                                                      | 141/1261 [01:04<08:14,  2.26it/s]
 11%|████████▉                                                                      | 142/1261 [01:05<08:07,  2.30it/s]
 11%|████████▉                                                                      | 143/1261 [01:05<08:01,  2.32it/s]
 11%|█████████                                                                      | 144/1261 [01:06<08:06,  2.30it/s]
 11%|█████████                                                                      | 145/1261 [01:06<07:59,  2.33it/s]
 12%|█████████▏                                                                     | 146/1261 [01:06<08:06,  2.29it/s]
 12%|█████████▏                                                                     | 147/1261 [01:07<09:48,  1.89it/s]
 12%|█████████▎                                                                     | 148/1261 [01:08<09:44,  1.90it/s]
 12%|█████████▎                                                                     | 149/1261 [01:08<09:08,  2.03it/s]
 12%|█████████▍                                                                     | 150/1261 [01:09<08:44,  2.12it/s]
 12%|█████████▍                                                                     | 151/1261 [01:09<08:22,  2.21it/s]
 12%|█████████▌                                                                     | 152/1261 [01:09<08:12,  2.25it/s]
 12%|█████████▌                                                                     | 153/1261 [01:10<08:10,  2.26it/s]
 12%|█████████▋                                                                     | 154/1261 [01:10<08:02,  2.30it/s]
 12%|█████████▋                                                                     | 155/1261 [01:11<08:09,  2.26it/s]
 12%|█████████▊                                                                     | 156/1261 [01:11<07:58,  2.31it/s]
 12%|█████████▊                                                                     | 157/1261 [01:12<07:54,  2.33it/s]
 13%|█████████▉                                                                     | 158/1261 [01:12<07:47,  2.36it/s]
 13%|█████████▉                                                                     | 159/1261 [01:13<09:26,  1.95it/s]
 13%|██████████                                                                     | 160/1261 [01:13<09:10,  2.00it/s]
 13%|██████████                                                                     | 161/1261 [01:14<08:51,  2.07it/s]
 13%|██████████▏                                                                    | 162/1261 [01:14<08:40,  2.11it/s]
 13%|██████████▏                                                                    | 163/1261 [01:14<08:31,  2.15it/s]
 13%|██████████▎                                                                    | 164/1261 [01:15<08:28,  2.16it/s]
 13%|██████████▎                                                                    | 165/1261 [01:15<08:54,  2.05it/s]
 13%|██████████▍                                                                    | 166/1261 [01:16<08:35,  2.12it/s]
 13%|██████████▍                                                                    | 167/1261 [01:16<08:18,  2.20it/s]
 13%|██████████▌                                                                    | 168/1261 [01:17<08:06,  2.24it/s]
 13%|██████████▌                                                                    | 169/1261 [01:17<08:07,  2.24it/s]
 13%|██████████▋                                                                    | 170/1261 [01:18<08:13,  2.21it/s]
 14%|██████████▋                                                                    | 171/1261 [01:18<09:39,  1.88it/s]
 14%|██████████▊                                                                    | 172/1261 [01:19<09:03,  2.01it/s]
 14%|██████████▊                                                                    | 173/1261 [01:19<08:34,  2.12it/s]
 14%|██████████▉                                                                    | 174/1261 [01:20<08:17,  2.19it/s]
 14%|██████████▉                                                                    | 175/1261 [01:20<08:08,  2.22it/s]
 14%|███████████                                                                    | 176/1261 [01:20<08:02,  2.25it/s]
 14%|███████████                                                                    | 177/1261 [01:21<08:04,  2.24it/s]
 14%|███████████▏                                                                   | 178/1261 [01:21<08:08,  2.22it/s]
 14%|███████████▏                                                                   | 179/1261 [01:22<08:01,  2.25it/s]
 14%|███████████▎                                                                   | 180/1261 [01:22<07:49,  2.30it/s]
 14%|███████████▎                                                                   | 181/1261 [01:23<07:47,  2.31it/s]
 14%|███████████▍                                                                   | 182/1261 [01:23<07:44,  2.32it/s]
 15%|███████████▍                                                                   | 183/1261 [01:24<09:11,  1.95it/s]
 15%|███████████▌                                                                   | 184/1261 [01:24<08:42,  2.06it/s]
 15%|███████████▌                                                                   | 185/1261 [01:25<08:23,  2.14it/s]
 15%|███████████▋                                                                   | 186/1261 [01:25<08:18,  2.16it/s]
 15%|███████████▋                                                                   | 187/1261 [01:26<08:07,  2.20it/s]
 15%|███████████▊                                                                   | 188/1261 [01:26<09:40,  1.85it/s]
 15%|███████████▊                                                                   | 189/1261 [01:27<09:03,  1.97it/s]
 15%|███████████▉                                                                   | 190/1261 [01:27<08:48,  2.03it/s]
 15%|███████████▉                                                                   | 191/1261 [01:28<08:29,  2.10it/s]
 15%|████████████                                                                   | 192/1261 [01:28<08:11,  2.18it/s]
 15%|████████████                                                                   | 193/1261 [01:28<08:02,  2.21it/s]
 15%|████████████▏                                                                  | 194/1261 [01:29<08:43,  2.04it/s]
 15%|████████████▏                                                                  | 195/1261 [01:30<09:10,  1.94it/s]
 16%|████████████▎                                                                  | 196/1261 [01:30<08:39,  2.05it/s]
 16%|████████████▎                                                                  | 197/1261 [01:30<08:26,  2.10it/s]
 16%|████████████▍                                                                  | 198/1261 [01:31<08:10,  2.17it/s]
 16%|████████████▍                                                                  | 199/1261 [01:31<07:59,  2.21it/s]
 16%|████████████▌                                                                  | 200/1261 [01:32<08:04,  2.19it/s]
 16%|████████████▌                                                                  | 201/1261 [01:32<07:53,  2.24it/s]
 16%|████████████▋                                                                  | 202/1261 [01:33<07:51,  2.25it/s]
 16%|████████████▋                                                                  | 203/1261 [01:33<07:41,  2.29it/s]
 16%|████████████▊                                                                  | 204/1261 [01:34<07:41,  2.29it/s]
 16%|████████████▊                                                                  | 205/1261 [01:34<07:36,  2.31it/s]
 16%|████████████▉                                                                  | 206/1261 [01:34<07:36,  2.31it/s]
 16%|████████████▉                                                                  | 207/1261 [01:35<09:10,  1.91it/s]
 16%|█████████████                                                                  | 208/1261 [01:36<08:39,  2.03it/s]
 17%|█████████████                                                                  | 209/1261 [01:36<08:19,  2.11it/s]
 17%|█████████████▏                                                                 | 210/1261 [01:36<07:59,  2.19it/s]
 17%|█████████████▏                                                                 | 211/1261 [01:37<07:45,  2.25it/s]
 17%|█████████████▎                                                                 | 212/1261 [01:37<07:43,  2.26it/s]
 17%|█████████████▎                                                                 | 213/1261 [01:38<07:40,  2.28it/s]
 17%|█████████████▍                                                                 | 214/1261 [01:38<07:38,  2.28it/s]
 17%|█████████████▍                                                                 | 215/1261 [01:39<07:47,  2.24it/s]
 17%|█████████████▌                                                                 | 216/1261 [01:39<07:36,  2.29it/s]
 17%|█████████████▌                                                                 | 217/1261 [01:39<07:45,  2.24it/s]
 17%|█████████████▋                                                                 | 218/1261 [01:40<07:33,  2.30it/s]
 17%|█████████████▋                                                                 | 219/1261 [01:41<09:04,  1.91it/s]
 17%|█████████████▊                                                                 | 220/1261 [01:41<08:40,  2.00it/s]
 18%|█████████████▊                                                                 | 221/1261 [01:41<08:23,  2.06it/s]
 18%|█████████████▉                                                                 | 222/1261 [01:42<08:01,  2.16it/s]
 18%|█████████████▉                                                                 | 223/1261 [01:42<07:46,  2.22it/s]
 18%|██████████████                                                                 | 224/1261 [01:43<07:41,  2.25it/s]
 18%|██████████████                                                                 | 225/1261 [01:43<08:16,  2.09it/s]
 18%|██████████████▏                                                                | 226/1261 [01:44<08:20,  2.07it/s]
 18%|██████████████▏                                                                | 227/1261 [01:44<08:26,  2.04it/s]
 18%|██████████████▎                                                                | 228/1261 [01:45<08:58,  1.92it/s]
 18%|██████████████▎                                                                | 229/1261 [01:45<08:25,  2.04it/s]
 18%|██████████████▍                                                                | 230/1261 [01:46<10:12,  1.68it/s]
 18%|██████████████▍                                                                | 231/1261 [01:47<09:27,  1.81it/s]
 18%|██████████████▌                                                                | 232/1261 [01:47<08:47,  1.95it/s]
 18%|██████████████▌                                                                | 233/1261 [01:47<08:32,  2.01it/s]
 19%|██████████████▋                                                                | 234/1261 [01:48<08:25,  2.03it/s]
 19%|██████████████▋                                                                | 235/1261 [01:48<08:17,  2.06it/s]
 19%|██████████████▊                                                                | 236/1261 [01:49<08:05,  2.11it/s]
 19%|██████████████▊                                                                | 237/1261 [01:49<07:47,  2.19it/s]
 19%|██████████████▉                                                                | 238/1261 [01:50<07:48,  2.18it/s]
 19%|██████████████▉                                                                | 239/1261 [01:50<07:45,  2.19it/s]
 19%|███████████████                                                                | 240/1261 [01:51<07:35,  2.24it/s]
 19%|███████████████                                                                | 241/1261 [01:51<07:36,  2.23it/s]
 19%|███████████████▏                                                               | 242/1261 [01:52<09:21,  1.82it/s]
 19%|███████████████▏                                                               | 243/1261 [01:52<08:54,  1.90it/s]
 19%|███████████████▎                                                               | 244/1261 [01:53<08:24,  2.02it/s]
 19%|███████████████▎                                                               | 245/1261 [01:53<08:12,  2.06it/s]
 20%|███████████████▍                                                               | 246/1261 [01:54<07:50,  2.16it/s]
 20%|███████████████▍                                                               | 247/1261 [01:54<07:36,  2.22it/s]
 20%|███████████████▌                                                               | 248/1261 [01:54<07:25,  2.28it/s]
 20%|███████████████▌                                                               | 249/1261 [01:55<07:19,  2.30it/s]
 20%|███████████████▋                                                               | 250/1261 [01:55<07:24,  2.27it/s]
 20%|███████████████▋                                                               | 251/1261 [01:56<07:16,  2.31it/s]
 20%|███████████████▊                                                               | 252/1261 [01:56<07:15,  2.32it/s]
 20%|███████████████▊                                                               | 253/1261 [01:57<07:10,  2.34it/s]
 20%|███████████████▉                                                               | 254/1261 [01:57<09:16,  1.81it/s]
 20%|███████████████▉                                                               | 255/1261 [01:58<09:26,  1.78it/s]
 20%|████████████████                                                               | 256/1261 [01:58<08:44,  1.92it/s]
 20%|████████████████                                                               | 257/1261 [01:59<08:25,  1.98it/s]
 20%|████████████████▏                                                              | 258/1261 [01:59<08:02,  2.08it/s]
 21%|████████████████▏                                                              | 259/1261 [02:00<07:52,  2.12it/s]
 21%|████████████████▎                                                              | 260/1261 [02:00<07:39,  2.18it/s]
 21%|████████████████▎                                                              | 261/1261 [02:01<07:38,  2.18it/s]
 21%|████████████████▍                                                              | 262/1261 [02:01<07:29,  2.22it/s]
 21%|████████████████▍                                                              | 263/1261 [02:02<07:23,  2.25it/s]
 21%|████████████████▌                                                              | 264/1261 [02:02<07:17,  2.28it/s]
 21%|████████████████▌                                                              | 265/1261 [02:03<08:04,  2.05it/s]
 21%|████████████████▋                                                              | 266/1261 [02:03<08:21,  1.98it/s]
 21%|████████████████▋                                                              | 267/1261 [02:04<07:56,  2.09it/s]
 21%|████████████████▊                                                              | 268/1261 [02:04<07:39,  2.16it/s]
 21%|████████████████▊                                                              | 269/1261 [02:04<07:28,  2.21it/s]
 21%|████████████████▉                                                              | 270/1261 [02:05<07:20,  2.25it/s]
 21%|████████████████▉                                                              | 271/1261 [02:05<07:11,  2.29it/s]
 22%|█████████████████                                                              | 272/1261 [02:06<07:09,  2.30it/s]
 22%|█████████████████                                                              | 273/1261 [02:06<07:04,  2.33it/s]
 22%|█████████████████▏                                                             | 274/1261 [02:07<07:05,  2.32it/s]
 22%|█████████████████▏                                                             | 275/1261 [02:07<06:59,  2.35it/s]
 22%|█████████████████▎                                                             | 276/1261 [02:07<07:08,  2.30it/s]
 22%|█████████████████▎                                                             | 277/1261 [02:08<07:02,  2.33it/s]
 22%|█████████████████▍                                                             | 278/1261 [02:09<08:31,  1.92it/s]
 22%|█████████████████▍                                                             | 279/1261 [02:09<08:01,  2.04it/s]
 22%|█████████████████▌                                                             | 280/1261 [02:09<07:43,  2.12it/s]
 22%|█████████████████▌                                                             | 281/1261 [02:10<07:23,  2.21it/s]
 22%|█████████████████▋                                                             | 282/1261 [02:10<07:13,  2.26it/s]
 22%|█████████████████▋                                                             | 283/1261 [02:11<07:07,  2.29it/s]
 23%|█████████████████▊                                                             | 284/1261 [02:11<07:02,  2.31it/s]
 23%|█████████████████▊                                                             | 285/1261 [02:11<07:01,  2.31it/s]
 23%|█████████████████▉                                                             | 286/1261 [02:12<06:55,  2.35it/s]
 23%|█████████████████▉                                                             | 287/1261 [02:12<06:55,  2.35it/s]
 23%|██████████████████                                                             | 288/1261 [02:13<06:52,  2.36it/s]
 23%|██████████████████                                                             | 289/1261 [02:13<06:57,  2.33it/s]
 23%|██████████████████▏                                                            | 290/1261 [02:14<08:16,  1.96it/s]
 23%|██████████████████▏                                                            | 291/1261 [02:14<07:55,  2.04it/s]
 23%|██████████████████▎                                                            | 292/1261 [02:15<07:34,  2.13it/s]
 23%|██████████████████▎                                                            | 293/1261 [02:15<07:21,  2.19it/s]
 23%|██████████████████▍                                                            | 294/1261 [02:16<07:21,  2.19it/s]
 23%|██████████████████▍                                                            | 295/1261 [02:16<07:15,  2.22it/s]
 23%|██████████████████▌                                                            | 296/1261 [02:17<07:07,  2.26it/s]
 24%|██████████████████▌                                                            | 297/1261 [02:17<06:56,  2.31it/s]
 24%|██████████████████▋                                                            | 298/1261 [02:17<06:51,  2.34it/s]
 24%|██████████████████▋                                                            | 299/1261 [02:18<06:55,  2.31it/s]
 24%|██████████████████▊                                                            | 300/1261 [02:18<06:51,  2.34it/s]
 24%|██████████████████▊                                                            | 301/1261 [02:19<06:51,  2.33it/s]
 24%|██████████████████▉                                                            | 302/1261 [02:19<07:35,  2.11it/s]
 24%|██████████████████▉                                                            | 303/1261 [02:20<07:58,  2.00it/s]
 24%|███████████████████                                                            | 304/1261 [02:20<07:34,  2.11it/s]
 24%|███████████████████                                                            | 305/1261 [02:21<07:19,  2.17it/s]
 24%|███████████████████▏                                                           | 306/1261 [02:21<07:05,  2.24it/s]
 24%|███████████████████▏                                                           | 307/1261 [02:21<06:59,  2.27it/s]
 24%|███████████████████▎                                                           | 308/1261 [02:22<06:53,  2.31it/s]
 25%|███████████████████▎                                                           | 309/1261 [02:22<06:47,  2.33it/s]
 25%|███████████████████▍                                                           | 310/1261 [02:23<06:55,  2.29it/s]
 25%|███████████████████▍                                                           | 311/1261 [02:23<06:54,  2.29it/s]
 25%|███████████████████▌                                                           | 312/1261 [02:24<06:52,  2.30it/s]
 25%|███████████████████▌                                                           | 313/1261 [02:24<06:48,  2.32it/s]
 25%|███████████████████▋                                                           | 314/1261 [02:24<06:51,  2.30it/s]
 25%|███████████████████▋                                                           | 315/1261 [02:25<08:05,  1.95it/s]
 25%|███████████████████▊                                                           | 316/1261 [02:26<07:40,  2.05it/s]
 25%|███████████████████▊                                                           | 317/1261 [02:26<07:25,  2.12it/s]
 25%|███████████████████▉                                                           | 318/1261 [02:26<07:07,  2.20it/s]
 25%|███████████████████▉                                                           | 319/1261 [02:27<07:00,  2.24it/s]
 25%|████████████████████                                                           | 320/1261 [02:27<06:51,  2.29it/s]
 25%|████████████████████                                                           | 321/1261 [02:28<07:37,  2.06it/s]
 26%|████████████████████▏                                                          | 322/1261 [02:28<07:19,  2.14it/s]
 26%|████████████████████▏                                                          | 323/1261 [02:29<07:08,  2.19it/s]
 26%|████████████████████▎                                                          | 324/1261 [02:29<06:56,  2.25it/s]
 26%|████████████████████▎                                                          | 325/1261 [02:30<06:51,  2.28it/s]
 26%|████████████████████▍                                                          | 326/1261 [02:30<06:45,  2.30it/s]
 26%|████████████████████▍                                                          | 327/1261 [02:31<08:03,  1.93it/s]
 26%|████████████████████▌                                                          | 328/1261 [02:31<07:48,  1.99it/s]
 26%|████████████████████▌                                                          | 329/1261 [02:32<08:18,  1.87it/s]
 26%|████████████████████▋                                                          | 330/1261 [02:32<08:09,  1.90it/s]
 26%|████████████████████▋                                                          | 331/1261 [02:33<08:19,  1.86it/s]
 26%|████████████████████▊                                                          | 332/1261 [02:33<07:48,  1.98it/s]
 26%|████████████████████▊                                                          | 333/1261 [02:34<07:25,  2.08it/s]
 26%|████████████████████▉                                                          | 334/1261 [02:34<07:10,  2.15it/s]
 27%|████████████████████▉                                                          | 335/1261 [02:35<07:03,  2.19it/s]
 27%|█████████████████████                                                          | 336/1261 [02:35<06:52,  2.24it/s]
 27%|█████████████████████                                                          | 337/1261 [02:35<07:03,  2.18it/s]
 27%|█████████████████████▏                                                         | 338/1261 [02:36<09:00,  1.71it/s]
 27%|█████████████████████▏                                                         | 339/1261 [02:37<08:17,  1.85it/s]
 27%|█████████████████████▎                                                         | 340/1261 [02:37<07:44,  1.98it/s]
 27%|█████████████████████▎                                                         | 341/1261 [02:38<07:46,  1.97it/s]
 27%|█████████████████████▍                                                         | 342/1261 [02:38<07:42,  1.99it/s]
 27%|█████████████████████▍                                                         | 343/1261 [02:39<07:55,  1.93it/s]
 27%|█████████████████████▌                                                         | 344/1261 [02:39<08:35,  1.78it/s]
 27%|█████████████████████▌                                                         | 345/1261 [02:40<08:33,  1.78it/s]
 27%|█████████████████████▋                                                         | 346/1261 [02:41<09:20,  1.63it/s]
 28%|█████████████████████▋                                                         | 347/1261 [02:42<11:37,  1.31it/s]
 28%|█████████████████████▊                                                         | 348/1261 [02:43<11:46,  1.29it/s]
 28%|█████████████████████▊                                                         | 349/1261 [02:43<10:59,  1.38it/s]
 28%|█████████████████████▉                                                         | 350/1261 [02:44<09:46,  1.55it/s]
 28%|█████████████████████▉                                                         | 351/1261 [02:44<08:54,  1.70it/s]
 28%|██████████████████████                                                         | 352/1261 [02:45<08:09,  1.86it/s]
 28%|██████████████████████                                                         | 353/1261 [02:45<07:38,  1.98it/s]
 28%|██████████████████████▏                                                        | 354/1261 [02:45<07:20,  2.06it/s]
 28%|██████████████████████▏                                                        | 355/1261 [02:46<07:14,  2.08it/s]
 28%|██████████████████████▎                                                        | 356/1261 [02:46<07:13,  2.09it/s]
 28%|██████████████████████▎                                                        | 357/1261 [02:47<06:55,  2.17it/s]
 28%|██████████████████████▍                                                        | 358/1261 [02:47<07:03,  2.13it/s]
 28%|██████████████████████▍                                                        | 359/1261 [02:48<08:09,  1.84it/s]
 29%|██████████████████████▌                                                        | 360/1261 [02:48<07:44,  1.94it/s]
 29%|██████████████████████▌                                                        | 361/1261 [02:49<07:29,  2.00it/s]
 29%|██████████████████████▋                                                        | 362/1261 [02:49<07:18,  2.05it/s]
 29%|██████████████████████▋                                                        | 363/1261 [02:50<07:11,  2.08it/s]
 29%|██████████████████████▊                                                        | 364/1261 [02:50<06:55,  2.16it/s]
 29%|██████████████████████▊                                                        | 365/1261 [02:51<06:43,  2.22it/s]
 29%|██████████████████████▉                                                        | 366/1261 [02:51<06:43,  2.22it/s]
 29%|██████████████████████▉                                                        | 367/1261 [02:52<06:46,  2.20it/s]
 29%|███████████████████████                                                        | 368/1261 [02:52<06:39,  2.24it/s]
 29%|███████████████████████                                                        | 369/1261 [02:53<06:40,  2.22it/s]
 29%|███████████████████████▏                                                       | 370/1261 [02:53<07:35,  1.96it/s]
 29%|███████████████████████▏                                                       | 371/1261 [02:54<07:47,  1.91it/s]
 30%|███████████████████████▎                                                       | 372/1261 [02:54<07:17,  2.03it/s]
 30%|███████████████████████▎                                                       | 373/1261 [02:55<07:30,  1.97it/s]
 30%|███████████████████████▍                                                       | 374/1261 [02:55<08:01,  1.84it/s]
 30%|███████████████████████▍                                                       | 375/1261 [02:56<07:37,  1.94it/s]
 30%|███████████████████████▌                                                       | 376/1261 [02:56<07:29,  1.97it/s]
 30%|███████████████████████▌                                                       | 377/1261 [02:57<07:49,  1.88it/s]
 30%|███████████████████████▋                                                       | 378/1261 [02:57<07:57,  1.85it/s]
 30%|███████████████████████▋                                                       | 379/1261 [02:58<08:07,  1.81it/s]
 30%|███████████████████████▊                                                       | 380/1261 [02:59<09:31,  1.54it/s]
 30%|███████████████████████▊                                                       | 381/1261 [03:00<10:08,  1.45it/s]
 30%|███████████████████████▉                                                       | 382/1261 [03:00<10:03,  1.46it/s]
 30%|███████████████████████▉                                                       | 383/1261 [03:01<08:56,  1.64it/s]
 30%|████████████████████████                                                       | 384/1261 [03:01<08:15,  1.77it/s]
 31%|████████████████████████                                                       | 385/1261 [03:02<07:46,  1.88it/s]
 31%|████████████████████████▏                                                      | 386/1261 [03:02<07:20,  1.99it/s]
 31%|████████████████████████▏                                                      | 387/1261 [03:03<07:07,  2.04it/s]
 31%|████████████████████████▎                                                      | 388/1261 [03:03<06:51,  2.12it/s]
 31%|████████████████████████▎                                                      | 389/1261 [03:03<06:40,  2.18it/s]
 31%|████████████████████████▍                                                      | 390/1261 [03:04<06:40,  2.17it/s]
 31%|████████████████████████▍                                                      | 391/1261 [03:04<06:57,  2.09it/s]
 31%|████████████████████████▌                                                      | 392/1261 [03:05<07:46,  1.86it/s]
 31%|████████████████████████▌                                                      | 393/1261 [03:06<07:28,  1.94it/s]
 31%|████████████████████████▋                                                      | 394/1261 [03:06<07:09,  2.02it/s]
 31%|████████████████████████▋                                                      | 395/1261 [03:06<07:05,  2.04it/s]
 31%|████████████████████████▊                                                      | 396/1261 [03:07<07:00,  2.06it/s]
 31%|████████████████████████▊                                                      | 397/1261 [03:08<07:28,  1.93it/s]
 32%|████████████████████████▉                                                      | 398/1261 [03:08<08:02,  1.79it/s]
 32%|████████████████████████▉                                                      | 399/1261 [03:09<08:24,  1.71it/s]
 32%|█████████████████████████                                                      | 400/1261 [03:10<09:10,  1.57it/s]
 32%|█████████████████████████                                                      | 401/1261 [03:11<10:16,  1.39it/s]
 32%|█████████████████████████▏                                                     | 402/1261 [03:11<09:46,  1.46it/s]
 32%|█████████████████████████▏                                                     | 403/1261 [03:12<08:44,  1.64it/s]
 32%|█████████████████████████▎                                                     | 404/1261 [03:12<07:59,  1.79it/s]
 32%|█████████████████████████▎                                                     | 405/1261 [03:12<07:23,  1.93it/s]
 32%|█████████████████████████▍                                                     | 406/1261 [03:13<06:59,  2.04it/s]
 32%|█████████████████████████▍                                                     | 407/1261 [03:13<06:52,  2.07it/s]
 32%|█████████████████████████▌                                                     | 408/1261 [03:14<06:41,  2.12it/s]
 32%|█████████████████████████▌                                                     | 409/1261 [03:14<06:40,  2.13it/s]
 33%|█████████████████████████▋                                                     | 410/1261 [03:15<06:31,  2.17it/s]
 33%|█████████████████████████▋                                                     | 411/1261 [03:15<06:29,  2.18it/s]
 33%|█████████████████████████▊                                                     | 412/1261 [03:16<06:50,  2.07it/s]
 33%|█████████████████████████▊                                                     | 413/1261 [03:16<07:22,  1.92it/s]
 33%|█████████████████████████▉                                                     | 414/1261 [03:17<06:59,  2.02it/s]
 33%|█████████████████████████▉                                                     | 415/1261 [03:17<06:43,  2.10it/s]
 33%|██████████████████████████                                                     | 416/1261 [03:18<06:39,  2.11it/s]
 33%|██████████████████████████                                                     | 417/1261 [03:18<06:27,  2.18it/s]
 33%|██████████████████████████▏                                                    | 418/1261 [03:19<06:49,  2.06it/s]
 33%|██████████████████████████▏                                                    | 419/1261 [03:19<06:40,  2.10it/s]
 33%|██████████████████████████▎                                                    | 420/1261 [03:20<07:05,  1.98it/s]
 33%|██████████████████████████▍                                                    | 421/1261 [03:20<06:56,  2.02it/s]
 33%|██████████████████████████▍                                                    | 422/1261 [03:20<06:37,  2.11it/s]
 34%|██████████████████████████▌                                                    | 423/1261 [03:21<06:22,  2.19it/s]
 34%|██████████████████████████▌                                                    | 424/1261 [03:22<07:21,  1.89it/s]
 34%|██████████████████████████▋                                                    | 425/1261 [03:22<07:05,  1.97it/s]
 34%|██████████████████████████▋                                                    | 426/1261 [03:23<07:01,  1.98it/s]
 34%|██████████████████████████▊                                                    | 427/1261 [03:23<06:43,  2.06it/s]
 34%|██████████████████████████▊                                                    | 428/1261 [03:23<06:44,  2.06it/s]
 34%|██████████████████████████▉                                                    | 429/1261 [03:24<06:33,  2.11it/s]
 34%|██████████████████████████▉                                                    | 430/1261 [03:24<06:22,  2.17it/s]
 34%|███████████████████████████                                                    | 431/1261 [03:25<06:18,  2.19it/s]
 34%|███████████████████████████                                                    | 432/1261 [03:25<06:22,  2.17it/s]
 34%|███████████████████████████▏                                                   | 433/1261 [03:26<06:23,  2.16it/s]
 34%|███████████████████████████▏                                                   | 434/1261 [03:26<06:19,  2.18it/s]
 34%|███████████████████████████▎                                                   | 435/1261 [03:27<06:44,  2.04it/s]
 35%|███████████████████████████▎                                                   | 436/1261 [03:27<07:14,  1.90it/s]
 35%|███████████████████████████▍                                                   | 437/1261 [03:28<07:08,  1.92it/s]
 35%|███████████████████████████▍                                                   | 438/1261 [03:28<06:44,  2.03it/s]
 35%|███████████████████████████▌                                                   | 439/1261 [03:29<06:40,  2.05it/s]
 35%|███████████████████████████▌                                                   | 440/1261 [03:29<06:32,  2.09it/s]
 35%|███████████████████████████▋                                                   | 441/1261 [03:30<06:26,  2.12it/s]
 35%|███████████████████████████▋                                                   | 442/1261 [03:30<06:22,  2.14it/s]
 35%|███████████████████████████▊                                                   | 443/1261 [03:31<06:14,  2.19it/s]
 35%|███████████████████████████▊                                                   | 444/1261 [03:31<06:14,  2.18it/s]
 35%|███████████████████████████▉                                                   | 445/1261 [03:31<06:08,  2.22it/s]
 35%|███████████████████████████▉                                                   | 446/1261 [03:32<06:02,  2.25it/s]
 35%|████████████████████████████                                                   | 447/1261 [03:33<06:54,  1.96it/s]
 36%|████████████████████████████                                                   | 448/1261 [03:33<06:49,  1.98it/s]
 36%|████████████████████████████▏                                                  | 449/1261 [03:34<06:38,  2.04it/s]
 36%|████████████████████████████▏                                                  | 450/1261 [03:34<06:24,  2.11it/s]
 36%|████████████████████████████▎                                                  | 451/1261 [03:34<06:09,  2.19it/s]
 36%|████████████████████████████▎                                                  | 452/1261 [03:35<06:01,  2.24it/s]
 36%|████████████████████████████▍                                                  | 453/1261 [03:35<06:07,  2.20it/s]
 36%|████████████████████████████▍                                                  | 454/1261 [03:36<06:06,  2.20it/s]
 36%|████████████████████████████▌                                                  | 455/1261 [03:36<06:14,  2.15it/s]
 36%|████████████████████████████▌                                                  | 456/1261 [03:37<06:17,  2.13it/s]
 36%|████████████████████████████▋                                                  | 457/1261 [03:37<06:08,  2.18it/s]
 36%|████████████████████████████▋                                                  | 458/1261 [03:38<06:11,  2.16it/s]
 36%|████████████████████████████▊                                                  | 459/1261 [03:38<06:52,  1.94it/s]
 36%|████████████████████████████▊                                                  | 460/1261 [03:39<06:48,  1.96it/s]
 37%|████████████████████████████▉                                                  | 461/1261 [03:39<06:38,  2.01it/s]
 37%|████████████████████████████▉                                                  | 462/1261 [03:40<06:38,  2.01it/s]
 37%|█████████████████████████████                                                  | 463/1261 [03:40<06:45,  1.97it/s]
 37%|█████████████████████████████                                                  | 464/1261 [03:41<06:45,  1.97it/s]
 37%|█████████████████████████████▏                                                 | 465/1261 [03:41<06:41,  1.98it/s]
 37%|█████████████████████████████▏                                                 | 466/1261 [03:42<06:24,  2.07it/s]
 37%|█████████████████████████████▎                                                 | 467/1261 [03:42<06:16,  2.11it/s]
 37%|█████████████████████████████▎                                                 | 468/1261 [03:43<06:43,  1.96it/s]
 37%|█████████████████████████████▍                                                 | 469/1261 [03:44<08:29,  1.55it/s]
 37%|█████████████████████████████▍                                                 | 470/1261 [03:44<08:22,  1.58it/s]
 37%|█████████████████████████████▌                                                 | 471/1261 [03:45<08:59,  1.46it/s]
 37%|█████████████████████████████▌                                                 | 472/1261 [03:46<08:02,  1.64it/s]
 38%|█████████████████████████████▋                                                 | 473/1261 [03:46<07:39,  1.71it/s]
 38%|█████████████████████████████▋                                                 | 474/1261 [03:47<07:21,  1.78it/s]
 38%|█████████████████████████████▊                                                 | 475/1261 [03:47<07:27,  1.76it/s]
 38%|█████████████████████████████▊                                                 | 476/1261 [03:48<06:56,  1.89it/s]
 38%|█████████████████████████████▉                                                 | 477/1261 [03:48<06:34,  1.99it/s]
 38%|█████████████████████████████▉                                                 | 478/1261 [03:48<06:17,  2.08it/s]
 38%|██████████████████████████████                                                 | 479/1261 [03:49<06:37,  1.97it/s]
 38%|██████████████████████████████                                                 | 480/1261 [03:50<07:52,  1.65it/s]
 38%|██████████████████████████████▏                                                | 481/1261 [03:50<07:19,  1.77it/s]
 38%|██████████████████████████████▏                                                | 482/1261 [03:51<06:49,  1.90it/s]
 38%|██████████████████████████████▎                                                | 483/1261 [03:51<06:32,  1.98it/s]
 38%|██████████████████████████████▎                                                | 484/1261 [03:52<06:32,  1.98it/s]
 38%|██████████████████████████████▍                                                | 485/1261 [03:52<06:35,  1.96it/s]
 39%|██████████████████████████████▍                                                | 486/1261 [03:53<06:39,  1.94it/s]
 39%|██████████████████████████████▌                                                | 487/1261 [03:53<06:44,  1.91it/s]
 39%|██████████████████████████████▌                                                | 488/1261 [03:54<06:40,  1.93it/s]
 39%|██████████████████████████████▋                                                | 489/1261 [03:54<06:47,  1.90it/s]
 39%|██████████████████████████████▋                                                | 490/1261 [03:55<08:28,  1.52it/s]
 39%|██████████████████████████████▊                                                | 491/1261 [03:56<08:38,  1.49it/s]
 39%|██████████████████████████████▊                                                | 492/1261 [03:56<07:40,  1.67it/s]
 39%|██████████████████████████████▉                                                | 493/1261 [03:57<07:01,  1.82it/s]
 39%|██████████████████████████████▉                                                | 494/1261 [03:57<06:56,  1.84it/s]
 39%|███████████████████████████████                                                | 495/1261 [03:58<06:39,  1.92it/s]
 39%|███████████████████████████████                                                | 496/1261 [03:58<06:22,  2.00it/s]
 39%|███████████████████████████████▏                                               | 497/1261 [03:59<06:35,  1.93it/s]
 39%|███████████████████████████████▏                                               | 498/1261 [04:00<06:55,  1.83it/s]
 40%|███████████████████████████████▎                                               | 499/1261 [04:00<08:33,  1.48it/s]
 40%|███████████████████████████████▎                                               | 500/1261 [04:01<09:12,  1.38it/s]
 40%|███████████████████████████████▍                                               | 501/1261 [04:02<08:10,  1.55it/s]
 40%|███████████████████████████████▍                                               | 502/1261 [04:02<07:45,  1.63it/s]
 40%|███████████████████████████████▌                                               | 503/1261 [04:03<07:17,  1.73it/s]
 40%|███████████████████████████████▌                                               | 504/1261 [04:03<07:18,  1.73it/s]
 40%|███████████████████████████████▋                                               | 505/1261 [04:04<06:53,  1.83it/s]
 40%|███████████████████████████████▋                                               | 506/1261 [04:04<06:42,  1.88it/s]
 40%|███████████████████████████████▊                                               | 507/1261 [04:05<06:21,  1.97it/s]
 40%|███████████████████████████████▊                                               | 508/1261 [04:05<06:10,  2.03it/s]
 40%|███████████████████████████████▉                                               | 509/1261 [04:06<05:56,  2.11it/s]
 40%|███████████████████████████████▉                                               | 510/1261 [04:06<06:45,  1.85it/s]
 41%|████████████████████████████████                                               | 511/1261 [04:07<06:35,  1.90it/s]
 41%|████████████████████████████████                                               | 512/1261 [04:07<06:22,  1.96it/s]
 41%|████████████████████████████████▏                                              | 513/1261 [04:08<06:10,  2.02it/s]
 41%|████████████████████████████████▏                                              | 514/1261 [04:08<06:07,  2.03it/s]
 41%|████████████████████████████████▎                                              | 515/1261 [04:09<06:02,  2.06it/s]
 41%|████████████████████████████████▎                                              | 516/1261 [04:09<05:53,  2.11it/s]
 41%|████████████████████████████████▍                                              | 517/1261 [04:10<05:44,  2.16it/s]
 41%|████████████████████████████████▍                                              | 518/1261 [04:10<05:47,  2.14it/s]
 41%|████████████████████████████████▌                                              | 519/1261 [04:11<06:03,  2.04it/s]
 41%|████████████████████████████████▌                                              | 520/1261 [04:11<05:53,  2.09it/s]
 41%|████████████████████████████████▋                                              | 521/1261 [04:12<06:42,  1.84it/s]
 41%|████████████████████████████████▋                                              | 522/1261 [04:12<06:31,  1.89it/s]
 41%|████████████████████████████████▊                                              | 523/1261 [04:13<06:10,  1.99it/s]
 42%|████████████████████████████████▊                                              | 524/1261 [04:13<06:03,  2.03it/s]
 42%|████████████████████████████████▉                                              | 525/1261 [04:14<05:59,  2.05it/s]
 42%|████████████████████████████████▉                                              | 526/1261 [04:14<05:53,  2.08it/s]
 42%|█████████████████████████████████                                              | 527/1261 [04:15<05:44,  2.13it/s]
 42%|█████████████████████████████████                                              | 528/1261 [04:15<05:34,  2.19it/s]
 42%|█████████████████████████████████▏                                             | 529/1261 [04:15<05:30,  2.21it/s]
 42%|█████████████████████████████████▏                                             | 530/1261 [04:16<05:30,  2.21it/s]
 42%|█████████████████████████████████▎                                             | 531/1261 [04:16<05:31,  2.20it/s]
 42%|█████████████████████████████████▎                                             | 532/1261 [04:17<05:36,  2.17it/s]
 42%|█████████████████████████████████▍                                             | 533/1261 [04:18<06:33,  1.85it/s]
 42%|█████████████████████████████████▍                                             | 534/1261 [04:18<06:10,  1.96it/s]
 42%|█████████████████████████████████▌                                             | 535/1261 [04:19<05:58,  2.03it/s]
 43%|█████████████████████████████████▌                                             | 536/1261 [04:19<05:50,  2.07it/s]
 43%|█████████████████████████████████▋                                             | 537/1261 [04:19<05:42,  2.11it/s]
 43%|█████████████████████████████████▋                                             | 538/1261 [04:20<05:42,  2.11it/s]
 43%|█████████████████████████████████▊                                             | 539/1261 [04:20<05:48,  2.07it/s]
 43%|█████████████████████████████████▊                                             | 540/1261 [04:21<05:38,  2.13it/s]
 43%|█████████████████████████████████▉                                             | 541/1261 [04:21<05:31,  2.17it/s]
 43%|█████████████████████████████████▉                                             | 542/1261 [04:22<05:35,  2.15it/s]
 43%|██████████████████████████████████                                             | 543/1261 [04:22<05:27,  2.19it/s]
 43%|██████████████████████████████████                                             | 544/1261 [04:23<05:59,  1.99it/s]
 43%|██████████████████████████████████▏                                            | 545/1261 [04:23<06:10,  1.93it/s]
 43%|██████████████████████████████████▏                                            | 546/1261 [04:24<05:51,  2.03it/s]
 43%|██████████████████████████████████▎                                            | 547/1261 [04:24<05:36,  2.12it/s]
 43%|██████████████████████████████████▎                                            | 548/1261 [04:25<05:32,  2.14it/s]
 44%|██████████████████████████████████▍                                            | 549/1261 [04:25<05:24,  2.19it/s]
 44%|██████████████████████████████████▍                                            | 550/1261 [04:26<05:22,  2.21it/s]
 44%|██████████████████████████████████▌                                            | 551/1261 [04:26<05:16,  2.24it/s]
 44%|██████████████████████████████████▌                                            | 552/1261 [04:26<05:22,  2.20it/s]
 44%|██████████████████████████████████▋                                            | 553/1261 [04:27<05:17,  2.23it/s]
 44%|██████████████████████████████████▋                                            | 554/1261 [04:27<05:13,  2.26it/s]
 44%|██████████████████████████████████▊                                            | 555/1261 [04:28<05:19,  2.21it/s]
 44%|██████████████████████████████████▊                                            | 556/1261 [04:28<06:03,  1.94it/s]
 44%|██████████████████████████████████▉                                            | 557/1261 [04:29<06:07,  1.91it/s]
 44%|██████████████████████████████████▉                                            | 558/1261 [04:29<05:57,  1.97it/s]
 44%|███████████████████████████████████                                            | 559/1261 [04:30<05:49,  2.01it/s]
 44%|███████████████████████████████████                                            | 560/1261 [04:30<05:34,  2.09it/s]
 44%|███████████████████████████████████▏                                           | 561/1261 [04:31<05:34,  2.09it/s]
 45%|███████████████████████████████████▏                                           | 562/1261 [04:31<06:06,  1.91it/s]
 45%|███████████████████████████████████▎                                           | 563/1261 [04:32<05:50,  1.99it/s]
 45%|███████████████████████████████████▎                                           | 564/1261 [04:32<05:32,  2.10it/s]
 45%|███████████████████████████████████▍                                           | 565/1261 [04:33<05:26,  2.13it/s]
 45%|███████████████████████████████████▍                                           | 566/1261 [04:33<05:21,  2.16it/s]
 45%|███████████████████████████████████▌                                           | 567/1261 [04:34<05:57,  1.94it/s]
 45%|███████████████████████████████████▌                                           | 568/1261 [04:34<06:02,  1.91it/s]
 45%|███████████████████████████████████▋                                           | 569/1261 [04:35<05:46,  2.00it/s]
 45%|███████████████████████████████████▋                                           | 570/1261 [04:35<05:37,  2.05it/s]
 45%|███████████████████████████████████▊                                           | 571/1261 [04:36<05:27,  2.11it/s]
 45%|███████████████████████████████████▊                                           | 572/1261 [04:36<05:17,  2.17it/s]
 45%|███████████████████████████████████▉                                           | 573/1261 [04:37<05:14,  2.19it/s]
 46%|███████████████████████████████████▉                                           | 574/1261 [04:37<05:10,  2.22it/s]
 46%|████████████████████████████████████                                           | 575/1261 [04:38<05:12,  2.19it/s]
 46%|████████████████████████████████████                                           | 576/1261 [04:38<05:08,  2.22it/s]
 46%|████████████████████████████████████▏                                          | 577/1261 [04:38<05:06,  2.23it/s]
 46%|████████████████████████████████████▏                                          | 578/1261 [04:39<05:05,  2.24it/s]
 46%|████████████████████████████████████▎                                          | 579/1261 [04:40<05:57,  1.91it/s]
 46%|████████████████████████████████████▎                                          | 580/1261 [04:40<05:48,  1.95it/s]
 46%|████████████████████████████████████▍                                          | 581/1261 [04:41<05:34,  2.03it/s]
 46%|████████████████████████████████████▍                                          | 582/1261 [04:41<05:28,  2.07it/s]
 46%|████████████████████████████████████▌                                          | 583/1261 [04:41<05:24,  2.09it/s]
 46%|████████████████████████████████████▌                                          | 584/1261 [04:42<05:15,  2.15it/s]
 46%|████████████████████████████████████▋                                          | 585/1261 [04:42<05:11,  2.17it/s]
 46%|████████████████████████████████████▋                                          | 586/1261 [04:43<05:13,  2.15it/s]
 47%|████████████████████████████████████▊                                          | 587/1261 [04:43<05:09,  2.18it/s]
 47%|████████████████████████████████████▊                                          | 588/1261 [04:44<05:08,  2.18it/s]
 47%|████████████████████████████████████▉                                          | 589/1261 [04:44<05:05,  2.20it/s]
 47%|████████████████████████████████████▉                                          | 590/1261 [04:45<05:19,  2.10it/s]
 47%|█████████████████████████████████████                                          | 591/1261 [04:45<05:50,  1.91it/s]
 47%|█████████████████████████████████████                                          | 592/1261 [04:46<05:38,  1.97it/s]
 47%|█████████████████████████████████████▏                                         | 593/1261 [04:46<05:27,  2.04it/s]
 47%|█████████████████████████████████████▏                                         | 594/1261 [04:47<05:17,  2.10it/s]
 47%|█████████████████████████████████████▎                                         | 595/1261 [04:47<05:16,  2.10it/s]
 47%|█████████████████████████████████████▎                                         | 596/1261 [04:48<05:16,  2.10it/s]
 47%|█████████████████████████████████████▍                                         | 597/1261 [04:48<05:07,  2.16it/s]
 47%|█████████████████████████████████████▍                                         | 598/1261 [04:49<05:04,  2.17it/s]
 48%|█████████████████████████████████████▌                                         | 599/1261 [04:49<05:02,  2.19it/s]
 48%|█████████████████████████████████████▌                                         | 600/1261 [04:49<05:05,  2.16it/s]
 48%|█████████████████████████████████████▋                                         | 601/1261 [04:50<04:59,  2.21it/s]
 48%|█████████████████████████████████████▋                                         | 602/1261 [04:51<05:52,  1.87it/s]
 48%|█████████████████████████████████████▊                                         | 603/1261 [04:51<05:44,  1.91it/s]
 48%|█████████████████████████████████████▊                                         | 604/1261 [04:52<05:30,  1.99it/s]
 48%|█████████████████████████████████████▉                                         | 605/1261 [04:52<05:21,  2.04it/s]
 48%|█████████████████████████████████████▉                                         | 606/1261 [04:52<05:21,  2.04it/s]
 48%|██████████████████████████████████████                                         | 607/1261 [04:53<05:11,  2.10it/s]
 48%|██████████████████████████████████████                                         | 608/1261 [04:53<05:05,  2.14it/s]
 48%|██████████████████████████████████████▏                                        | 609/1261 [04:54<05:00,  2.17it/s]
 48%|██████████████████████████████████████▏                                        | 610/1261 [04:54<04:57,  2.19it/s]
 48%|██████████████████████████████████████▎                                        | 611/1261 [04:55<04:55,  2.20it/s]
 49%|██████████████████████████████████████▎                                        | 612/1261 [04:55<04:59,  2.17it/s]
 49%|██████████████████████████████████████▍                                        | 613/1261 [04:56<05:19,  2.03it/s]
 49%|██████████████████████████████████████▍                                        | 614/1261 [04:56<05:49,  1.85it/s]
 49%|██████████████████████████████████████▌                                        | 615/1261 [04:57<05:29,  1.96it/s]
 49%|██████████████████████████████████████▌                                        | 616/1261 [04:57<05:27,  1.97it/s]
 49%|██████████████████████████████████████▋                                        | 617/1261 [04:58<05:16,  2.03it/s]
 49%|██████████████████████████████████████▋                                        | 618/1261 [04:58<05:04,  2.11it/s]
 49%|██████████████████████████████████████▊                                        | 619/1261 [04:59<05:02,  2.12it/s]
 49%|██████████████████████████████████████▊                                        | 620/1261 [04:59<04:53,  2.18it/s]
 49%|██████████████████████████████████████▉                                        | 621/1261 [05:00<04:49,  2.21it/s]
 49%|██████████████████████████████████████▉                                        | 622/1261 [05:00<04:44,  2.24it/s]
 49%|███████████████████████████████████████                                        | 623/1261 [05:00<04:43,  2.25it/s]
 49%|███████████████████████████████████████                                        | 624/1261 [05:01<04:44,  2.24it/s]
 50%|███████████████████████████████████████▏                                       | 625/1261 [05:02<05:50,  1.82it/s]
 50%|███████████████████████████████████████▏                                       | 626/1261 [05:02<05:30,  1.92it/s]
 50%|███████████████████████████████████████▎                                       | 627/1261 [05:03<05:12,  2.03it/s]
 50%|███████████████████████████████████████▎                                       | 628/1261 [05:03<04:59,  2.11it/s]
 50%|███████████████████████████████████████▍                                       | 629/1261 [05:03<04:52,  2.16it/s]
 50%|███████████████████████████████████████▍                                       | 630/1261 [05:04<04:44,  2.22it/s]
 50%|███████████████████████████████████████▌                                       | 631/1261 [05:04<04:39,  2.26it/s]
 50%|███████████████████████████████████████▌                                       | 632/1261 [05:05<04:36,  2.27it/s]
 50%|███████████████████████████████████████▋                                       | 633/1261 [05:05<04:33,  2.29it/s]
 50%|███████████████████████████████████████▋                                       | 634/1261 [05:06<04:37,  2.26it/s]
 50%|███████████████████████████████████████▊                                       | 635/1261 [05:06<04:34,  2.28it/s]
 50%|███████████████████████████████████████▊                                       | 636/1261 [05:07<04:39,  2.23it/s]
 51%|███████████████████████████████████████▉                                       | 637/1261 [05:07<05:26,  1.91it/s]
 51%|███████████████████████████████████████▉                                       | 638/1261 [05:08<05:25,  1.92it/s]
 51%|████████████████████████████████████████                                       | 639/1261 [05:08<05:05,  2.03it/s]
 51%|████████████████████████████████████████                                       | 640/1261 [05:09<04:55,  2.10it/s]
 51%|████████████████████████████████████████▏                                      | 641/1261 [05:09<04:47,  2.16it/s]
 51%|████████████████████████████████████████▏                                      | 642/1261 [05:09<04:42,  2.19it/s]
 51%|████████████████████████████████████████▎                                      | 643/1261 [05:10<04:45,  2.17it/s]
 51%|████████████████████████████████████████▎                                      | 644/1261 [05:10<04:46,  2.15it/s]
 51%|████████████████████████████████████████▍                                      | 645/1261 [05:11<04:40,  2.20it/s]
 51%|████████████████████████████████████████▍                                      | 646/1261 [05:11<04:36,  2.23it/s]
 51%|████████████████████████████████████████▌                                      | 647/1261 [05:12<04:42,  2.17it/s]
 51%|████████████████████████████████████████▌                                      | 648/1261 [05:12<04:51,  2.10it/s]
 51%|████████████████████████████████████████▋                                      | 649/1261 [05:13<05:24,  1.89it/s]
 52%|████████████████████████████████████████▋                                      | 650/1261 [05:13<05:07,  1.99it/s]
 52%|████████████████████████████████████████▊                                      | 651/1261 [05:14<04:59,  2.04it/s]
 52%|████████████████████████████████████████▊                                      | 652/1261 [05:14<05:03,  2.01it/s]
 52%|████████████████████████████████████████▉                                      | 653/1261 [05:15<04:58,  2.04it/s]
 52%|████████████████████████████████████████▉                                      | 654/1261 [05:15<05:05,  1.99it/s]
 52%|█████████████████████████████████████████                                      | 655/1261 [05:16<05:23,  1.87it/s]
 52%|█████████████████████████████████████████                                      | 656/1261 [05:16<05:15,  1.92it/s]
 52%|█████████████████████████████████████████▏                                     | 657/1261 [05:17<05:37,  1.79it/s]
 52%|█████████████████████████████████████████▏                                     | 658/1261 [05:18<05:21,  1.87it/s]
 52%|█████████████████████████████████████████▎                                     | 659/1261 [05:18<06:06,  1.64it/s]
 52%|█████████████████████████████████████████▎                                     | 660/1261 [05:19<05:56,  1.69it/s]
 52%|█████████████████████████████████████████▍                                     | 661/1261 [05:19<05:32,  1.80it/s]
 52%|█████████████████████████████████████████▍                                     | 662/1261 [05:20<05:11,  1.92it/s]
 53%|█████████████████████████████████████████▌                                     | 663/1261 [05:20<04:55,  2.03it/s]
 53%|█████████████████████████████████████████▌                                     | 664/1261 [05:21<04:43,  2.11it/s]
 53%|█████████████████████████████████████████▋                                     | 665/1261 [05:21<04:36,  2.16it/s]
 53%|█████████████████████████████████████████▋                                     | 666/1261 [05:22<04:37,  2.15it/s]
 53%|█████████████████████████████████████████▊                                     | 667/1261 [05:22<04:31,  2.19it/s]
 53%|█████████████████████████████████████████▊                                     | 668/1261 [05:22<04:34,  2.16it/s]
 53%|█████████████████████████████████████████▉                                     | 669/1261 [05:23<04:34,  2.16it/s]
 53%|█████████████████████████████████████████▉                                     | 670/1261 [05:24<04:54,  2.01it/s]
 53%|██████████████████████████████████████████                                     | 671/1261 [05:24<05:09,  1.91it/s]
 53%|██████████████████████████████████████████                                     | 672/1261 [05:25<04:56,  1.99it/s]
 53%|██████████████████████████████████████████▏                                    | 673/1261 [05:25<04:45,  2.06it/s]
 53%|██████████████████████████████████████████▏                                    | 674/1261 [05:26<04:45,  2.05it/s]
 54%|██████████████████████████████████████████▎                                    | 675/1261 [05:26<04:36,  2.12it/s]
 54%|██████████████████████████████████████████▎                                    | 676/1261 [05:26<04:35,  2.12it/s]
 54%|██████████████████████████████████████████▍                                    | 677/1261 [05:27<04:37,  2.11it/s]
 54%|██████████████████████████████████████████▍                                    | 678/1261 [05:27<04:39,  2.09it/s]
 54%|██████████████████████████████████████████▌                                    | 679/1261 [05:28<04:32,  2.14it/s]
 54%|██████████████████████████████████████████▌                                    | 680/1261 [05:28<04:26,  2.18it/s]
 54%|██████████████████████████████████████████▋                                    | 681/1261 [05:29<04:24,  2.19it/s]
 54%|██████████████████████████████████████████▋                                    | 682/1261 [05:29<05:12,  1.85it/s]
 54%|██████████████████████████████████████████▊                                    | 683/1261 [05:30<04:53,  1.97it/s]
 54%|██████████████████████████████████████████▊                                    | 684/1261 [05:30<04:40,  2.06it/s]
 54%|██████████████████████████████████████████▉                                    | 685/1261 [05:31<04:29,  2.14it/s]
 54%|██████████████████████████████████████████▉                                    | 686/1261 [05:31<04:25,  2.16it/s]
 54%|███████████████████████████████████████████                                    | 687/1261 [05:32<04:21,  2.20it/s]
 55%|███████████████████████████████████████████                                    | 688/1261 [05:32<04:14,  2.25it/s]
 55%|███████████████████████████████████████████▏                                   | 689/1261 [05:33<04:17,  2.22it/s]
 55%|███████████████████████████████████████████▏                                   | 690/1261 [05:33<04:16,  2.22it/s]
 55%|███████████████████████████████████████████▎                                   | 691/1261 [05:33<04:12,  2.26it/s]
 55%|███████████████████████████████████████████▎                                   | 692/1261 [05:34<04:14,  2.24it/s]
 55%|███████████████████████████████████████████▍                                   | 693/1261 [05:34<04:09,  2.28it/s]
 55%|███████████████████████████████████████████▍                                   | 694/1261 [05:35<05:00,  1.89it/s]
 55%|███████████████████████████████████████████▌                                   | 695/1261 [05:35<04:45,  1.98it/s]
 55%|███████████████████████████████████████████▌                                   | 696/1261 [05:36<04:36,  2.04it/s]
 55%|███████████████████████████████████████████▋                                   | 697/1261 [05:36<04:31,  2.08it/s]
 55%|███████████████████████████████████████████▋                                   | 698/1261 [05:37<04:28,  2.09it/s]
 55%|███████████████████████████████████████████▊                                   | 699/1261 [05:37<04:18,  2.17it/s]
 56%|███████████████████████████████████████████▊                                   | 700/1261 [05:38<04:19,  2.17it/s]
 56%|███████████████████████████████████████████▉                                   | 701/1261 [05:38<04:13,  2.21it/s]
 56%|███████████████████████████████████████████▉                                   | 702/1261 [05:39<04:09,  2.24it/s]
 56%|████████████████████████████████████████████                                   | 703/1261 [05:39<04:07,  2.26it/s]
 56%|████████████████████████████████████████████                                   | 704/1261 [05:39<04:05,  2.27it/s]
 56%|████████████████████████████████████████████▏                                  | 705/1261 [05:40<04:04,  2.27it/s]
 56%|████████████████████████████████████████████▏                                  | 706/1261 [05:41<04:49,  1.92it/s]
 56%|████████████████████████████████████████████▎                                  | 707/1261 [05:41<04:41,  1.97it/s]
 56%|████████████████████████████████████████████▎                                  | 708/1261 [05:42<04:34,  2.02it/s]
 56%|████████████████████████████████████████████▍                                  | 709/1261 [05:42<04:24,  2.09it/s]
 56%|████████████████████████████████████████████▍                                  | 710/1261 [05:42<04:14,  2.16it/s]
 56%|████████████████████████████████████████████▌                                  | 711/1261 [05:43<04:21,  2.10it/s]
 56%|████████████████████████████████████████████▌                                  | 712/1261 [05:44<04:39,  1.97it/s]
 57%|████████████████████████████████████████████▋                                  | 713/1261 [05:44<04:35,  1.99it/s]
 57%|████████████████████████████████████████████▋                                  | 714/1261 [05:45<06:04,  1.50it/s]
 57%|████████████████████████████████████████████▊                                  | 715/1261 [05:46<05:37,  1.62it/s]
 57%|████████████████████████████████████████████▊                                  | 716/1261 [05:46<06:15,  1.45it/s]
 57%|████████████████████████████████████████████▉                                  | 717/1261 [05:47<05:31,  1.64it/s]
 57%|████████████████████████████████████████████▉                                  | 718/1261 [05:47<05:03,  1.79it/s]
 57%|█████████████████████████████████████████████                                  | 719/1261 [05:48<04:48,  1.88it/s]
 57%|█████████████████████████████████████████████                                  | 720/1261 [05:48<04:48,  1.88it/s]
 57%|█████████████████████████████████████████████▏                                 | 721/1261 [05:49<04:33,  1.97it/s]
 57%|█████████████████████████████████████████████▏                                 | 722/1261 [05:49<04:24,  2.04it/s]
 57%|█████████████████████████████████████████████▎                                 | 723/1261 [05:50<04:19,  2.07it/s]
 57%|█████████████████████████████████████████████▎                                 | 724/1261 [05:50<04:15,  2.11it/s]
 57%|█████████████████████████████████████████████▍                                 | 725/1261 [05:51<04:11,  2.13it/s]
 58%|█████████████████████████████████████████████▍                                 | 726/1261 [05:51<04:15,  2.10it/s]
 58%|█████████████████████████████████████████████▌                                 | 727/1261 [05:52<05:04,  1.75it/s]
 58%|█████████████████████████████████████████████▌                                 | 728/1261 [05:52<04:50,  1.83it/s]
 58%|█████████████████████████████████████████████▋                                 | 729/1261 [05:53<04:34,  1.94it/s]
 58%|█████████████████████████████████████████████▋                                 | 730/1261 [05:53<04:28,  1.98it/s]
 58%|█████████████████████████████████████████████▊                                 | 731/1261 [05:54<04:17,  2.06it/s]
 58%|█████████████████████████████████████████████▊                                 | 732/1261 [05:54<04:39,  1.90it/s]
 58%|█████████████████████████████████████████████▉                                 | 733/1261 [05:55<04:30,  1.95it/s]
 58%|█████████████████████████████████████████████▉                                 | 734/1261 [05:55<04:23,  2.00it/s]
 58%|██████████████████████████████████████████████                                 | 735/1261 [05:56<04:25,  1.98it/s]
 58%|██████████████████████████████████████████████                                 | 736/1261 [05:56<04:18,  2.03it/s]
 58%|██████████████████████████████████████████████▏                                | 737/1261 [05:57<04:25,  1.98it/s]
 59%|██████████████████████████████████████████████▏                                | 738/1261 [05:58<05:19,  1.64it/s]
 59%|██████████████████████████████████████████████▎                                | 739/1261 [05:58<05:02,  1.73it/s]
 59%|██████████████████████████████████████████████▎                                | 740/1261 [05:59<04:44,  1.83it/s]
 59%|██████████████████████████████████████████████▍                                | 741/1261 [05:59<04:33,  1.90it/s]
 59%|██████████████████████████████████████████████▍                                | 742/1261 [06:00<04:54,  1.76it/s]
 59%|██████████████████████████████████████████████▌                                | 743/1261 [06:00<05:01,  1.72it/s]
 59%|██████████████████████████████████████████████▌                                | 744/1261 [06:01<04:41,  1.84it/s]
 59%|██████████████████████████████████████████████▋                                | 745/1261 [06:01<04:25,  1.95it/s]
 59%|██████████████████████████████████████████████▋                                | 746/1261 [06:02<04:15,  2.01it/s]
 59%|██████████████████████████████████████████████▊                                | 747/1261 [06:02<04:22,  1.96it/s]
 59%|██████████████████████████████████████████████▊                                | 748/1261 [06:03<04:55,  1.74it/s]
 59%|██████████████████████████████████████████████▉                                | 749/1261 [06:03<04:35,  1.86it/s]
 59%|██████████████████████████████████████████████▉                                | 750/1261 [06:04<04:20,  1.96it/s]
 60%|███████████████████████████████████████████████                                | 751/1261 [06:04<04:10,  2.04it/s]
 60%|███████████████████████████████████████████████                                | 752/1261 [06:05<04:05,  2.07it/s]
 60%|███████████████████████████████████████████████▏                               | 753/1261 [06:05<03:57,  2.14it/s]
 60%|███████████████████████████████████████████████▏                               | 754/1261 [06:06<03:53,  2.17it/s]
 60%|███████████████████████████████████████████████▎                               | 755/1261 [06:06<03:47,  2.22it/s]
 60%|███████████████████████████████████████████████▎                               | 756/1261 [06:07<03:49,  2.20it/s]
 60%|███████████████████████████████████████████████▍                               | 757/1261 [06:07<03:48,  2.21it/s]
 60%|███████████████████████████████████████████████▍                               | 758/1261 [06:07<03:48,  2.20it/s]
 60%|███████████████████████████████████████████████▌                               | 759/1261 [06:08<03:43,  2.25it/s]
 60%|███████████████████████████████████████████████▌                               | 760/1261 [06:09<04:40,  1.78it/s]
 60%|███████████████████████████████████████████████▋                               | 761/1261 [06:09<04:25,  1.88it/s]
 60%|███████████████████████████████████████████████▋                               | 762/1261 [06:10<04:11,  1.99it/s]
 61%|███████████████████████████████████████████████▊                               | 763/1261 [06:10<04:03,  2.05it/s]
 61%|███████████████████████████████████████████████▊                               | 764/1261 [06:11<04:10,  1.98it/s]
 61%|███████████████████████████████████████████████▉                               | 765/1261 [06:11<03:59,  2.07it/s]
 61%|███████████████████████████████████████████████▉                               | 766/1261 [06:12<03:58,  2.08it/s]
 61%|████████████████████████████████████████████████                               | 767/1261 [06:12<03:51,  2.14it/s]
 61%|████████████████████████████████████████████████                               | 768/1261 [06:12<03:48,  2.15it/s]
 61%|████████████████████████████████████████████████▏                              | 769/1261 [06:13<03:44,  2.19it/s]
 61%|████████████████████████████████████████████████▏                              | 770/1261 [06:13<03:44,  2.18it/s]
 61%|████████████████████████████████████████████████▎                              | 771/1261 [06:14<04:23,  1.86it/s]
 61%|████████████████████████████████████████████████▎                              | 772/1261 [06:15<04:10,  1.95it/s]
 61%|████████████████████████████████████████████████▍                              | 773/1261 [06:15<04:00,  2.03it/s]
 61%|████████████████████████████████████████████████▍                              | 774/1261 [06:15<03:49,  2.12it/s]
 61%|████████████████████████████████████████████████▌                              | 775/1261 [06:16<03:42,  2.18it/s]
 62%|████████████████████████████████████████████████▌                              | 776/1261 [06:16<03:37,  2.23it/s]
 62%|████████████████████████████████████████████████▋                              | 777/1261 [06:17<03:35,  2.25it/s]
 62%|████████████████████████████████████████████████▋                              | 778/1261 [06:17<03:32,  2.28it/s]
 62%|████████████████████████████████████████████████▊                              | 779/1261 [06:18<03:33,  2.26it/s]
 62%|████████████████████████████████████████████████▊                              | 780/1261 [06:18<03:36,  2.23it/s]
 62%|████████████████████████████████████████████████▉                              | 781/1261 [06:18<03:33,  2.25it/s]
 62%|████████████████████████████████████████████████▉                              | 782/1261 [06:19<03:31,  2.27it/s]
 62%|█████████████████████████████████████████████████                              | 783/1261 [06:20<04:17,  1.86it/s]
 62%|█████████████████████████████████████████████████                              | 784/1261 [06:20<04:01,  1.97it/s]
 62%|█████████████████████████████████████████████████▏                             | 785/1261 [06:21<04:03,  1.96it/s]
 62%|█████████████████████████████████████████████████▏                             | 786/1261 [06:21<03:56,  2.01it/s]
 62%|█████████████████████████████████████████████████▎                             | 787/1261 [06:22<03:47,  2.08it/s]
 62%|█████████████████████████████████████████████████▎                             | 788/1261 [06:22<03:38,  2.16it/s]
 63%|█████████████████████████████████████████████████▍                             | 789/1261 [06:22<03:35,  2.19it/s]
 63%|█████████████████████████████████████████████████▍                             | 790/1261 [06:23<03:29,  2.24it/s]
 63%|█████████████████████████████████████████████████▌                             | 791/1261 [06:23<03:28,  2.26it/s]
 63%|█████████████████████████████████████████████████▌                             | 792/1261 [06:24<03:23,  2.30it/s]
 63%|█████████████████████████████████████████████████▋                             | 793/1261 [06:24<03:24,  2.29it/s]
 63%|█████████████████████████████████████████████████▋                             | 794/1261 [06:25<03:23,  2.30it/s]
 63%|█████████████████████████████████████████████████▊                             | 795/1261 [06:25<04:05,  1.90it/s]
 63%|█████████████████████████████████████████████████▊                             | 796/1261 [06:26<03:51,  2.01it/s]
 63%|█████████████████████████████████████████████████▉                             | 797/1261 [06:26<03:40,  2.10it/s]
 63%|█████████████████████████████████████████████████▉                             | 798/1261 [06:27<03:33,  2.17it/s]
 63%|██████████████████████████████████████████████████                             | 799/1261 [06:27<03:32,  2.17it/s]
 63%|██████████████████████████████████████████████████                             | 800/1261 [06:27<03:34,  2.15it/s]
 64%|██████████████████████████████████████████████████▏                            | 801/1261 [06:28<03:44,  2.05it/s]
 64%|██████████████████████████████████████████████████▏                            | 802/1261 [06:28<03:43,  2.05it/s]
 64%|██████████████████████████████████████████████████▎                            | 803/1261 [06:29<03:44,  2.04it/s]
 64%|██████████████████████████████████████████████████▎                            | 804/1261 [06:30<04:40,  1.63it/s]
 64%|██████████████████████████████████████████████████▍                            | 805/1261 [06:31<04:58,  1.53it/s]
 64%|██████████████████████████████████████████████████▍                            | 806/1261 [06:31<04:56,  1.54it/s]
 64%|██████████████████████████████████████████████████▌                            | 807/1261 [06:32<05:10,  1.46it/s]
 64%|██████████████████████████████████████████████████▌                            | 808/1261 [06:33<04:42,  1.60it/s]
 64%|██████████████████████████████████████████████████▋                            | 809/1261 [06:33<04:48,  1.57it/s]
 64%|██████████████████████████████████████████████████▋                            | 810/1261 [06:34<04:22,  1.72it/s]
 64%|██████████████████████████████████████████████████▊                            | 811/1261 [06:34<04:05,  1.83it/s]
 64%|██████████████████████████████████████████████████▊                            | 812/1261 [06:35<04:20,  1.72it/s]
 64%|██████████████████████████████████████████████████▉                            | 813/1261 [06:35<04:33,  1.64it/s]
 65%|██████████████████████████████████████████████████▉                            | 814/1261 [06:36<05:06,  1.46it/s]
 65%|███████████████████████████████████████████████████                            | 815/1261 [06:37<05:02,  1.48it/s]
 65%|███████████████████████████████████████████████████                            | 816/1261 [06:38<05:00,  1.48it/s]
 65%|███████████████████████████████████████████████████▏                           | 817/1261 [06:38<04:55,  1.50it/s]
 65%|███████████████████████████████████████████████████▏                           | 818/1261 [06:39<04:33,  1.62it/s]
 65%|███████████████████████████████████████████████████▎                           | 819/1261 [06:40<05:09,  1.43it/s]
 65%|███████████████████████████████████████████████████▎                           | 820/1261 [06:40<04:47,  1.54it/s]
 65%|███████████████████████████████████████████████████▍                           | 821/1261 [06:41<04:30,  1.63it/s]
 65%|███████████████████████████████████████████████████▍                           | 822/1261 [06:41<04:11,  1.75it/s]
 65%|███████████████████████████████████████████████████▌                           | 823/1261 [06:42<04:50,  1.51it/s]
 65%|███████████████████████████████████████████████████▌                           | 824/1261 [06:43<05:00,  1.45it/s]
 65%|███████████████████████████████████████████████████▋                           | 825/1261 [06:43<04:51,  1.49it/s]
 66%|███████████████████████████████████████████████████▋                           | 826/1261 [06:44<04:25,  1.64it/s]
 66%|███████████████████████████████████████████████████▊                           | 827/1261 [06:44<04:07,  1.76it/s]
 66%|███████████████████████████████████████████████████▊                           | 828/1261 [06:45<03:51,  1.87it/s]
 66%|███████████████████████████████████████████████████▉                           | 829/1261 [06:46<04:07,  1.75it/s]
 66%|███████████████████████████████████████████████████▉                           | 830/1261 [06:46<03:55,  1.83it/s]
 66%|████████████████████████████████████████████████████                           | 831/1261 [06:47<03:56,  1.82it/s]
 66%|████████████████████████████████████████████████████                           | 832/1261 [06:47<04:34,  1.56it/s]
 66%|████████████████████████████████████████████████████▏                          | 833/1261 [06:48<04:13,  1.69it/s]
 66%|████████████████████████████████████████████████████▏                          | 834/1261 [06:48<03:53,  1.83it/s]
 66%|████████████████████████████████████████████████████▎                          | 835/1261 [06:49<03:39,  1.94it/s]
 66%|████████████████████████████████████████████████████▎                          | 836/1261 [06:49<03:31,  2.01it/s]
 66%|████████████████████████████████████████████████████▍                          | 837/1261 [06:50<03:23,  2.09it/s]
 66%|████████████████████████████████████████████████████▍                          | 838/1261 [06:50<03:21,  2.10it/s]
 67%|████████████████████████████████████████████████████▌                          | 839/1261 [06:51<03:27,  2.03it/s]
 67%|████████████████████████████████████████████████████▌                          | 840/1261 [06:51<03:19,  2.11it/s]
 67%|████████████████████████████████████████████████████▋                          | 841/1261 [06:52<03:12,  2.18it/s]
 67%|████████████████████████████████████████████████████▊                          | 842/1261 [06:52<03:12,  2.17it/s]
 67%|████████████████████████████████████████████████████▊                          | 843/1261 [06:53<03:21,  2.07it/s]
 67%|████████████████████████████████████████████████████▉                          | 844/1261 [06:53<03:47,  1.83it/s]
 67%|████████████████████████████████████████████████████▉                          | 845/1261 [06:54<03:34,  1.94it/s]
 67%|█████████████████████████████████████████████████████                          | 846/1261 [06:54<03:32,  1.95it/s]
 67%|█████████████████████████████████████████████████████                          | 847/1261 [06:55<03:22,  2.04it/s]
 67%|█████████████████████████████████████████████████████▏                         | 848/1261 [06:55<03:18,  2.08it/s]
 67%|█████████████████████████████████████████████████████▏                         | 849/1261 [06:56<03:16,  2.10it/s]
 67%|█████████████████████████████████████████████████████▎                         | 850/1261 [06:56<03:23,  2.02it/s]
 67%|█████████████████████████████████████████████████████▎                         | 851/1261 [06:57<03:16,  2.08it/s]
 68%|█████████████████████████████████████████████████████▍                         | 852/1261 [06:57<03:17,  2.07it/s]
 68%|█████████████████████████████████████████████████████▍                         | 853/1261 [06:57<03:10,  2.14it/s]
 68%|█████████████████████████████████████████████████████▌                         | 854/1261 [06:58<03:11,  2.12it/s]
 68%|█████████████████████████████████████████████████████▌                         | 855/1261 [06:59<04:10,  1.62it/s]
 68%|█████████████████████████████████████████████████████▋                         | 856/1261 [06:59<04:04,  1.66it/s]
 68%|█████████████████████████████████████████████████████▋                         | 857/1261 [07:00<03:49,  1.76it/s]
 68%|█████████████████████████████████████████████████████▊                         | 858/1261 [07:01<03:57,  1.70it/s]
 68%|█████████████████████████████████████████████████████▊                         | 859/1261 [07:01<03:55,  1.71it/s]
 68%|█████████████████████████████████████████████████████▉                         | 860/1261 [07:02<03:37,  1.84it/s]
 68%|█████████████████████████████████████████████████████▉                         | 861/1261 [07:02<03:34,  1.86it/s]
 68%|██████████████████████████████████████████████████████                         | 862/1261 [07:03<03:39,  1.82it/s]
 68%|██████████████████████████████████████████████████████                         | 863/1261 [07:03<03:23,  1.95it/s]
 69%|██████████████████████████████████████████████████████▏                        | 864/1261 [07:04<03:14,  2.04it/s]
 69%|██████████████████████████████████████████████████████▏                        | 865/1261 [07:04<04:01,  1.64it/s]
 69%|██████████████████████████████████████████████████████▎                        | 866/1261 [07:05<03:41,  1.79it/s]
 69%|██████████████████████████████████████████████████████▎                        | 867/1261 [07:05<03:32,  1.86it/s]
 69%|██████████████████████████████████████████████████████▍                        | 868/1261 [07:06<03:29,  1.87it/s]
 69%|██████████████████████████████████████████████████████▍                        | 869/1261 [07:06<03:19,  1.96it/s]
 69%|██████████████████████████████████████████████████████▌                        | 870/1261 [07:07<03:11,  2.05it/s]
 69%|██████████████████████████████████████████████████████▌                        | 871/1261 [07:07<03:24,  1.90it/s]
 69%|██████████████████████████████████████████████████████▋                        | 872/1261 [07:08<03:17,  1.97it/s]
 69%|██████████████████████████████████████████████████████▋                        | 873/1261 [07:08<03:07,  2.07it/s]
 69%|██████████████████████████████████████████████████████▊                        | 874/1261 [07:09<03:01,  2.13it/s]
 69%|██████████████████████████████████████████████████████▊                        | 875/1261 [07:09<03:08,  2.04it/s]
 69%|██████████████████████████████████████████████████████▉                        | 876/1261 [07:10<03:39,  1.76it/s]
 70%|██████████████████████████████████████████████████████▉                        | 877/1261 [07:11<03:27,  1.85it/s]
 70%|███████████████████████████████████████████████████████                        | 878/1261 [07:11<03:14,  1.97it/s]
 70%|███████████████████████████████████████████████████████                        | 879/1261 [07:11<03:05,  2.06it/s]
 70%|███████████████████████████████████████████████████████▏                       | 880/1261 [07:12<03:02,  2.09it/s]
 70%|███████████████████████████████████████████████████████▏                       | 881/1261 [07:12<02:56,  2.16it/s]
 70%|███████████████████████████████████████████████████████▎                       | 882/1261 [07:13<02:57,  2.13it/s]
 70%|███████████████████████████████████████████████████████▎                       | 883/1261 [07:13<02:56,  2.14it/s]
 70%|███████████████████████████████████████████████████████▍                       | 884/1261 [07:14<02:57,  2.13it/s]
 70%|███████████████████████████████████████████████████████▍                       | 885/1261 [07:14<02:52,  2.18it/s]
 70%|███████████████████████████████████████████████████████▌                       | 886/1261 [07:15<02:50,  2.19it/s]
 70%|███████████████████████████████████████████████████████▌                       | 887/1261 [07:15<03:18,  1.88it/s]
 70%|███████████████████████████████████████████████████████▋                       | 888/1261 [07:16<03:18,  1.88it/s]
 70%|███████████████████████████████████████████████████████▋                       | 889/1261 [07:16<03:21,  1.84it/s]
 71%|███████████████████████████████████████████████████████▊                       | 890/1261 [07:17<03:11,  1.94it/s]
 71%|███████████████████████████████████████████████████████▊                       | 891/1261 [07:17<03:00,  2.05it/s]
 71%|███████████████████████████████████████████████████████▉                       | 892/1261 [07:18<03:11,  1.92it/s]
 71%|███████████████████████████████████████████████████████▉                       | 893/1261 [07:18<03:07,  1.96it/s]
 71%|████████████████████████████████████████████████████████                       | 894/1261 [07:19<02:57,  2.06it/s]
 71%|████████████████████████████████████████████████████████                       | 895/1261 [07:19<02:54,  2.10it/s]
 71%|████████████████████████████████████████████████████████▏                      | 896/1261 [07:20<02:59,  2.03it/s]
 71%|████████████████████████████████████████████████████████▏                      | 897/1261 [07:20<02:55,  2.07it/s]
 71%|████████████████████████████████████████████████████████▎                      | 898/1261 [07:21<03:06,  1.95it/s]
 71%|████████████████████████████████████████████████████████▎                      | 899/1261 [07:21<03:11,  1.89it/s]
 71%|████████████████████████████████████████████████████████▍                      | 900/1261 [07:22<03:00,  2.00it/s]
 71%|████████████████████████████████████████████████████████▍                      | 901/1261 [07:22<02:51,  2.10it/s]
 72%|████████████████████████████████████████████████████████▌                      | 902/1261 [07:23<02:49,  2.12it/s]
 72%|████████████████████████████████████████████████████████▌                      | 903/1261 [07:23<02:44,  2.18it/s]
 72%|████████████████████████████████████████████████████████▋                      | 904/1261 [07:24<02:42,  2.19it/s]
 72%|████████████████████████████████████████████████████████▋                      | 905/1261 [07:24<02:41,  2.21it/s]
 72%|████████████████████████████████████████████████████████▊                      | 906/1261 [07:24<02:39,  2.23it/s]
 72%|████████████████████████████████████████████████████████▊                      | 907/1261 [07:25<02:38,  2.24it/s]
 72%|████████████████████████████████████████████████████████▉                      | 908/1261 [07:25<02:40,  2.20it/s]
 72%|████████████████████████████████████████████████████████▉                      | 909/1261 [07:26<02:40,  2.19it/s]
 72%|█████████████████████████████████████████████████████████                      | 910/1261 [07:26<02:58,  1.97it/s]
 72%|█████████████████████████████████████████████████████████                      | 911/1261 [07:27<02:59,  1.95it/s]
 72%|█████████████████████████████████████████████████████████▏                     | 912/1261 [07:27<02:55,  1.99it/s]
 72%|█████████████████████████████████████████████████████████▏                     | 913/1261 [07:28<02:46,  2.09it/s]
 72%|█████████████████████████████████████████████████████████▎                     | 914/1261 [07:28<02:43,  2.12it/s]
 73%|█████████████████████████████████████████████████████████▎                     | 915/1261 [07:29<02:42,  2.13it/s]
 73%|█████████████████████████████████████████████████████████▍                     | 916/1261 [07:29<02:38,  2.18it/s]
 73%|█████████████████████████████████████████████████████████▍                     | 917/1261 [07:30<02:44,  2.09it/s]
 73%|█████████████████████████████████████████████████████████▌                     | 918/1261 [07:30<02:40,  2.14it/s]
 73%|█████████████████████████████████████████████████████████▌                     | 919/1261 [07:31<02:35,  2.20it/s]
 73%|█████████████████████████████████████████████████████████▋                     | 920/1261 [07:31<02:34,  2.20it/s]
 73%|█████████████████████████████████████████████████████████▋                     | 921/1261 [07:31<02:32,  2.24it/s]
 73%|█████████████████████████████████████████████████████████▊                     | 922/1261 [07:32<02:57,  1.91it/s]
 73%|█████████████████████████████████████████████████████████▊                     | 923/1261 [07:33<02:49,  2.00it/s]
 73%|█████████████████████████████████████████████████████████▉                     | 924/1261 [07:33<02:45,  2.03it/s]
 73%|█████████████████████████████████████████████████████████▉                     | 925/1261 [07:34<02:38,  2.12it/s]
 73%|██████████████████████████████████████████████████████████                     | 926/1261 [07:34<02:39,  2.11it/s]
 74%|██████████████████████████████████████████████████████████                     | 927/1261 [07:34<02:37,  2.11it/s]
 74%|██████████████████████████████████████████████████████████▏                    | 928/1261 [07:35<02:34,  2.16it/s]
 74%|██████████████████████████████████████████████████████████▏                    | 929/1261 [07:35<02:31,  2.19it/s]
 74%|██████████████████████████████████████████████████████████▎                    | 930/1261 [07:36<02:28,  2.23it/s]
 74%|██████████████████████████████████████████████████████████▎                    | 931/1261 [07:36<02:31,  2.18it/s]
 74%|██████████████████████████████████████████████████████████▍                    | 932/1261 [07:37<02:30,  2.19it/s]
 74%|██████████████████████████████████████████████████████████▍                    | 933/1261 [07:37<02:31,  2.17it/s]
 74%|██████████████████████████████████████████████████████████▌                    | 934/1261 [07:38<02:51,  1.90it/s]
 74%|██████████████████████████████████████████████████████████▌                    | 935/1261 [07:38<02:42,  2.01it/s]
 74%|██████████████████████████████████████████████████████████▋                    | 936/1261 [07:39<02:37,  2.06it/s]
 74%|██████████████████████████████████████████████████████████▋                    | 937/1261 [07:39<02:46,  1.94it/s]
 74%|██████████████████████████████████████████████████████████▊                    | 938/1261 [07:40<02:45,  1.96it/s]
 74%|██████████████████████████████████████████████████████████▊                    | 939/1261 [07:40<02:36,  2.06it/s]
 75%|██████████████████████████████████████████████████████████▉                    | 940/1261 [07:41<02:31,  2.11it/s]
 75%|██████████████████████████████████████████████████████████▉                    | 941/1261 [07:41<02:25,  2.19it/s]
 75%|███████████████████████████████████████████████████████████                    | 942/1261 [07:42<02:25,  2.20it/s]
 75%|███████████████████████████████████████████████████████████                    | 943/1261 [07:42<02:22,  2.24it/s]
 75%|███████████████████████████████████████████████████████████▏                   | 944/1261 [07:42<02:24,  2.20it/s]
 75%|███████████████████████████████████████████████████████████▏                   | 945/1261 [07:44<03:25,  1.54it/s]
 75%|███████████████████████████████████████████████████████████▎                   | 946/1261 [07:44<03:12,  1.64it/s]
 75%|███████████████████████████████████████████████████████████▎                   | 947/1261 [07:45<03:40,  1.43it/s]
 75%|███████████████████████████████████████████████████████████▍                   | 948/1261 [07:46<03:22,  1.54it/s]
 75%|███████████████████████████████████████████████████████████▍                   | 949/1261 [07:46<03:38,  1.43it/s]
 75%|███████████████████████████████████████████████████████████▌                   | 950/1261 [07:47<03:19,  1.56it/s]
 75%|███████████████████████████████████████████████████████████▌                   | 951/1261 [07:47<03:05,  1.67it/s]
 75%|███████████████████████████████████████████████████████████▋                   | 952/1261 [07:48<02:51,  1.80it/s]
 76%|███████████████████████████████████████████████████████████▋                   | 953/1261 [07:48<02:49,  1.81it/s]
 76%|███████████████████████████████████████████████████████████▊                   | 954/1261 [07:49<03:07,  1.64it/s]
 76%|███████████████████████████████████████████████████████████▊                   | 955/1261 [07:50<03:04,  1.66it/s]
 76%|███████████████████████████████████████████████████████████▉                   | 956/1261 [07:50<02:52,  1.77it/s]
 76%|███████████████████████████████████████████████████████████▉                   | 957/1261 [07:51<02:40,  1.90it/s]
 76%|████████████████████████████████████████████████████████████                   | 958/1261 [07:51<02:30,  2.01it/s]
 76%|████████████████████████████████████████████████████████████                   | 959/1261 [07:52<02:33,  1.97it/s]
 76%|████████████████████████████████████████████████████████████▏                  | 960/1261 [07:52<02:27,  2.04it/s]
 76%|████████████████████████████████████████████████████████████▏                  | 961/1261 [07:53<02:25,  2.06it/s]
 76%|████████████████████████████████████████████████████████████▎                  | 962/1261 [07:53<02:21,  2.12it/s]
 76%|████████████████████████████████████████████████████████████▎                  | 963/1261 [07:53<02:20,  2.12it/s]
 76%|████████████████████████████████████████████████████████████▍                  | 964/1261 [07:54<02:19,  2.13it/s]
 77%|████████████████████████████████████████████████████████████▍                  | 965/1261 [07:55<02:39,  1.85it/s]
 77%|████████████████████████████████████████████████████████████▌                  | 966/1261 [07:55<02:34,  1.91it/s]
 77%|████████████████████████████████████████████████████████████▌                  | 967/1261 [07:56<02:26,  2.00it/s]
 77%|████████████████████████████████████████████████████████████▋                  | 968/1261 [07:56<02:28,  1.97it/s]
 77%|████████████████████████████████████████████████████████████▋                  | 969/1261 [07:57<02:24,  2.02it/s]
 77%|████████████████████████████████████████████████████████████▊                  | 970/1261 [07:57<02:27,  1.97it/s]
 77%|████████████████████████████████████████████████████████████▊                  | 971/1261 [07:57<02:21,  2.06it/s]
 77%|████████████████████████████████████████████████████████████▉                  | 972/1261 [07:58<02:17,  2.11it/s]
 77%|████████████████████████████████████████████████████████████▉                  | 973/1261 [07:58<02:12,  2.17it/s]
 77%|█████████████████████████████████████████████████████████████                  | 974/1261 [07:59<02:10,  2.19it/s]
 77%|█████████████████████████████████████████████████████████████                  | 975/1261 [07:59<02:10,  2.18it/s]
 77%|█████████████████████████████████████████████████████████████▏                 | 976/1261 [08:00<02:25,  1.96it/s]
 77%|█████████████████████████████████████████████████████████████▏                 | 977/1261 [08:00<02:28,  1.92it/s]
 78%|█████████████████████████████████████████████████████████████▎                 | 978/1261 [08:01<02:18,  2.04it/s]
 78%|█████████████████████████████████████████████████████████████▎                 | 979/1261 [08:01<02:13,  2.11it/s]
 78%|█████████████████████████████████████████████████████████████▍                 | 980/1261 [08:02<02:09,  2.17it/s]
 78%|█████████████████████████████████████████████████████████████▍                 | 981/1261 [08:02<02:07,  2.19it/s]
 78%|█████████████████████████████████████████████████████████████▌                 | 982/1261 [08:03<02:07,  2.18it/s]
 78%|█████████████████████████████████████████████████████████████▌                 | 983/1261 [08:03<02:09,  2.15it/s]
 78%|█████████████████████████████████████████████████████████████▋                 | 984/1261 [08:04<02:07,  2.17it/s]
 78%|█████████████████████████████████████████████████████████████▋                 | 985/1261 [08:04<02:06,  2.18it/s]
 78%|█████████████████████████████████████████████████████████████▊                 | 986/1261 [08:04<02:05,  2.18it/s]
 78%|█████████████████████████████████████████████████████████████▊                 | 987/1261 [08:05<02:19,  1.97it/s]
 78%|█████████████████████████████████████████████████████████████▉                 | 988/1261 [08:06<02:38,  1.73it/s]
 78%|█████████████████████████████████████████████████████████████▉                 | 989/1261 [08:06<02:29,  1.82it/s]
 79%|██████████████████████████████████████████████████████████████                 | 990/1261 [08:07<02:37,  1.72it/s]
 79%|██████████████████████████████████████████████████████████████                 | 991/1261 [08:07<02:30,  1.79it/s]
 79%|██████████████████████████████████████████████████████████████▏                | 992/1261 [08:08<02:27,  1.83it/s]
 79%|██████████████████████████████████████████████████████████████▏                | 993/1261 [08:09<02:22,  1.88it/s]
 79%|██████████████████████████████████████████████████████████████▎                | 994/1261 [08:09<02:21,  1.89it/s]
 79%|██████████████████████████████████████████████████████████████▎                | 995/1261 [08:10<02:22,  1.87it/s]
 79%|██████████████████████████████████████████████████████████████▍                | 996/1261 [08:10<02:17,  1.93it/s]
 79%|██████████████████████████████████████████████████████████████▍                | 997/1261 [08:11<02:20,  1.88it/s]
 79%|██████████████████████████████████████████████████████████████▌                | 998/1261 [08:11<02:36,  1.68it/s]
 79%|██████████████████████████████████████████████████████████████▌                | 999/1261 [08:12<02:29,  1.75it/s]
 79%|█████████████████████████████████████████████████████████████▊                | 1000/1261 [08:12<02:23,  1.82it/s]
 79%|█████████████████████████████████████████████████████████████▉                | 1001/1261 [08:13<02:15,  1.92it/s]
 79%|█████████████████████████████████████████████████████████████▉                | 1002/1261 [08:13<02:12,  1.96it/s]
 80%|██████████████████████████████████████████████████████████████                | 1003/1261 [08:14<02:10,  1.98it/s]
 80%|██████████████████████████████████████████████████████████████                | 1004/1261 [08:15<02:42,  1.58it/s]
 80%|██████████████████████████████████████████████████████████████▏               | 1005/1261 [08:15<02:31,  1.69it/s]
 80%|██████████████████████████████████████████████████████████████▏               | 1006/1261 [08:16<02:38,  1.61it/s]
 80%|██████████████████████████████████████████████████████████████▎               | 1007/1261 [08:17<02:57,  1.43it/s]
 80%|██████████████████████████████████████████████████████████████▎               | 1008/1261 [08:17<02:44,  1.53it/s]
 80%|██████████████████████████████████████████████████████████████▍               | 1009/1261 [08:18<02:37,  1.60it/s]
 80%|██████████████████████████████████████████████████████████████▍               | 1010/1261 [08:18<02:24,  1.73it/s]
 80%|██████████████████████████████████████████████████████████████▌               | 1011/1261 [08:19<02:14,  1.86it/s]
 80%|██████████████████████████████████████████████████████████████▌               | 1012/1261 [08:19<02:08,  1.93it/s]
 80%|██████████████████████████████████████████████████████████████▋               | 1013/1261 [08:20<02:06,  1.96it/s]
 80%|██████████████████████████████████████████████████████████████▋               | 1014/1261 [08:20<02:02,  2.01it/s]
 80%|██████████████████████████████████████████████████████████████▊               | 1015/1261 [08:21<02:01,  2.03it/s]
 81%|██████████████████████████████████████████████████████████████▊               | 1016/1261 [08:21<01:57,  2.08it/s]
 81%|██████████████████████████████████████████████████████████████▉               | 1017/1261 [08:22<01:57,  2.07it/s]
 81%|██████████████████████████████████████████████████████████████▉               | 1018/1261 [08:22<02:14,  1.81it/s]
 81%|███████████████████████████████████████████████████████████████               | 1019/1261 [08:23<02:08,  1.89it/s]
 81%|███████████████████████████████████████████████████████████████               | 1020/1261 [08:23<02:05,  1.92it/s]
 81%|███████████████████████████████████████████████████████████████▏              | 1021/1261 [08:24<02:00,  1.99it/s]
 81%|███████████████████████████████████████████████████████████████▏              | 1022/1261 [08:24<01:57,  2.04it/s]
 81%|███████████████████████████████████████████████████████████████▎              | 1023/1261 [08:25<02:00,  1.98it/s]
 81%|███████████████████████████████████████████████████████████████▎              | 1024/1261 [08:25<01:57,  2.02it/s]
 81%|███████████████████████████████████████████████████████████████▍              | 1025/1261 [08:26<01:56,  2.03it/s]
 81%|███████████████████████████████████████████████████████████████▍              | 1026/1261 [08:26<01:53,  2.06it/s]
 81%|███████████████████████████████████████████████████████████████▌              | 1027/1261 [08:27<01:52,  2.08it/s]
 82%|███████████████████████████████████████████████████████████████▌              | 1028/1261 [08:27<01:49,  2.13it/s]
 82%|███████████████████████████████████████████████████████████████▋              | 1029/1261 [08:28<02:07,  1.82it/s]
 82%|███████████████████████████████████████████████████████████████▋              | 1030/1261 [08:28<02:03,  1.87it/s]
 82%|███████████████████████████████████████████████████████████████▊              | 1031/1261 [08:29<01:57,  1.96it/s]
 82%|███████████████████████████████████████████████████████████████▊              | 1032/1261 [08:29<01:55,  1.99it/s]
 82%|███████████████████████████████████████████████████████████████▉              | 1033/1261 [08:30<01:55,  1.97it/s]
 82%|███████████████████████████████████████████████████████████████▉              | 1034/1261 [08:30<01:55,  1.96it/s]
 82%|████████████████████████████████████████████████████████████████              | 1035/1261 [08:31<02:04,  1.82it/s]
 82%|████████████████████████████████████████████████████████████████              | 1036/1261 [08:32<02:00,  1.86it/s]
 82%|████████████████████████████████████████████████████████████████▏             | 1037/1261 [08:32<01:53,  1.97it/s]
 82%|████████████████████████████████████████████████████████████████▏             | 1038/1261 [08:32<01:49,  2.03it/s]
 82%|████████████████████████████████████████████████████████████████▎             | 1039/1261 [08:33<01:46,  2.09it/s]
 82%|████████████████████████████████████████████████████████████████▎             | 1040/1261 [08:34<02:01,  1.82it/s]
 83%|████████████████████████████████████████████████████████████████▍             | 1041/1261 [08:34<01:52,  1.95it/s]
 83%|████████████████████████████████████████████████████████████████▍             | 1042/1261 [08:34<01:45,  2.08it/s]
 83%|████████████████████████████████████████████████████████████████▌             | 1043/1261 [08:35<01:40,  2.16it/s]
 83%|████████████████████████████████████████████████████████████████▌             | 1044/1261 [08:35<01:37,  2.24it/s]
 83%|████████████████████████████████████████████████████████████████▋             | 1045/1261 [08:36<01:34,  2.29it/s]
 83%|████████████████████████████████████████████████████████████████▋             | 1046/1261 [08:36<01:31,  2.36it/s]
 83%|████████████████████████████████████████████████████████████████▊             | 1047/1261 [08:36<01:29,  2.38it/s]
 83%|████████████████████████████████████████████████████████████████▊             | 1048/1261 [08:37<01:30,  2.35it/s]
 83%|████████████████████████████████████████████████████████████████▉             | 1049/1261 [08:37<01:30,  2.35it/s]
 83%|████████████████████████████████████████████████████████████████▉             | 1050/1261 [08:38<01:27,  2.41it/s]
 83%|█████████████████████████████████████████████████████████████████             | 1051/1261 [08:38<01:29,  2.34it/s]
 83%|█████████████████████████████████████████████████████████████████             | 1052/1261 [08:39<01:35,  2.19it/s]
 84%|█████████████████████████████████████████████████████████████████▏            | 1053/1261 [08:39<01:41,  2.06it/s]
 84%|█████████████████████████████████████████████████████████████████▏            | 1054/1261 [08:40<01:37,  2.12it/s]
 84%|█████████████████████████████████████████████████████████████████▎            | 1055/1261 [08:40<01:35,  2.16it/s]
 84%|█████████████████████████████████████████████████████████████████▎            | 1056/1261 [08:41<01:31,  2.23it/s]
 84%|█████████████████████████████████████████████████████████████████▍            | 1057/1261 [08:41<01:29,  2.28it/s]
 84%|█████████████████████████████████████████████████████████████████▍            | 1058/1261 [08:41<01:30,  2.24it/s]
 84%|█████████████████████████████████████████████████████████████████▌            | 1059/1261 [08:42<01:29,  2.27it/s]
 84%|█████████████████████████████████████████████████████████████████▌            | 1060/1261 [08:42<01:26,  2.32it/s]
 84%|█████████████████████████████████████████████████████████████████▋            | 1061/1261 [08:43<01:25,  2.33it/s]
 84%|█████████████████████████████████████████████████████████████████▋            | 1062/1261 [08:43<01:26,  2.30it/s]
 84%|█████████████████████████████████████████████████████████████████▊            | 1063/1261 [08:44<01:25,  2.32it/s]
 84%|█████████████████████████████████████████████████████████████████▊            | 1064/1261 [08:44<01:25,  2.31it/s]
 84%|█████████████████████████████████████████████████████████████████▉            | 1065/1261 [08:45<01:39,  1.98it/s]
 85%|█████████████████████████████████████████████████████████████████▉            | 1066/1261 [08:45<01:35,  2.04it/s]
 85%|██████████████████████████████████████████████████████████████████            | 1067/1261 [08:46<01:31,  2.12it/s]
 85%|██████████████████████████████████████████████████████████████████            | 1068/1261 [08:46<01:31,  2.10it/s]
 85%|██████████████████████████████████████████████████████████████████            | 1069/1261 [08:47<01:32,  2.08it/s]
 85%|██████████████████████████████████████████████████████████████████▏           | 1070/1261 [08:47<01:28,  2.15it/s]
 85%|██████████████████████████████████████████████████████████████████▏           | 1071/1261 [08:47<01:26,  2.19it/s]
 85%|██████████████████████████████████████████████████████████████████▎           | 1072/1261 [08:48<01:23,  2.26it/s]
 85%|██████████████████████████████████████████████████████████████████▎           | 1073/1261 [08:48<01:23,  2.24it/s]
 85%|██████████████████████████████████████████████████████████████████▍           | 1074/1261 [08:49<01:29,  2.08it/s]
 85%|██████████████████████████████████████████████████████████████████▍           | 1075/1261 [08:49<01:25,  2.17it/s]
 85%|██████████████████████████████████████████████████████████████████▌           | 1076/1261 [08:50<01:38,  1.89it/s]
 85%|██████████████████████████████████████████████████████████████████▌           | 1077/1261 [08:51<01:40,  1.84it/s]
 85%|██████████████████████████████████████████████████████████████████▋           | 1078/1261 [08:51<01:35,  1.92it/s]
 86%|██████████████████████████████████████████████████████████████████▋           | 1079/1261 [08:51<01:29,  2.02it/s]
 86%|██████████████████████████████████████████████████████████████████▊           | 1080/1261 [08:52<01:24,  2.14it/s]
 86%|██████████████████████████████████████████████████████████████████▊           | 1081/1261 [08:52<01:26,  2.08it/s]
 86%|██████████████████████████████████████████████████████████████████▉           | 1082/1261 [08:53<01:26,  2.08it/s]
 86%|██████████████████████████████████████████████████████████████████▉           | 1083/1261 [08:53<01:26,  2.07it/s]
 86%|███████████████████████████████████████████████████████████████████           | 1084/1261 [08:54<01:26,  2.05it/s]
 86%|███████████████████████████████████████████████████████████████████           | 1085/1261 [08:54<01:24,  2.07it/s]
 86%|███████████████████████████████████████████████████████████████████▏          | 1086/1261 [08:55<01:28,  1.98it/s]
 86%|███████████████████████████████████████████████████████████████████▏          | 1087/1261 [08:56<02:00,  1.45it/s]
 86%|███████████████████████████████████████████████████████████████████▎          | 1088/1261 [08:57<02:02,  1.41it/s]
 86%|███████████████████████████████████████████████████████████████████▎          | 1089/1261 [08:57<02:00,  1.43it/s]
 86%|███████████████████████████████████████████████████████████████████▍          | 1090/1261 [08:58<01:52,  1.52it/s]
 87%|███████████████████████████████████████████████████████████████████▍          | 1091/1261 [08:58<01:42,  1.66it/s]
 87%|███████████████████████████████████████████████████████████████████▌          | 1092/1261 [08:59<01:34,  1.79it/s]
 87%|███████████████████████████████████████████████████████████████████▌          | 1093/1261 [08:59<01:28,  1.89it/s]
 87%|███████████████████████████████████████████████████████████████████▋          | 1094/1261 [09:00<01:25,  1.95it/s]
 87%|███████████████████████████████████████████████████████████████████▋          | 1095/1261 [09:00<01:30,  1.84it/s]
 87%|███████████████████████████████████████████████████████████████████▊          | 1096/1261 [09:01<01:35,  1.73it/s]
 87%|███████████████████████████████████████████████████████████████████▊          | 1097/1261 [09:02<01:44,  1.57it/s]
 87%|███████████████████████████████████████████████████████████████████▉          | 1098/1261 [09:02<01:35,  1.71it/s]
 87%|███████████████████████████████████████████████████████████████████▉          | 1099/1261 [09:03<01:29,  1.81it/s]
 87%|████████████████████████████████████████████████████████████████████          | 1100/1261 [09:03<01:24,  1.90it/s]
 87%|████████████████████████████████████████████████████████████████████          | 1101/1261 [09:04<01:21,  1.96it/s]
 87%|████████████████████████████████████████████████████████████████████▏         | 1102/1261 [09:04<01:19,  2.01it/s]
 87%|████████████████████████████████████████████████████████████████████▏         | 1103/1261 [09:05<01:16,  2.06it/s]
 88%|████████████████████████████████████████████████████████████████████▎         | 1104/1261 [09:05<01:14,  2.12it/s]
 88%|████████████████████████████████████████████████████████████████████▎         | 1105/1261 [09:06<01:12,  2.14it/s]
 88%|████████████████████████████████████████████████████████████████████▍         | 1106/1261 [09:06<01:13,  2.12it/s]
 88%|████████████████████████████████████████████████████████████████████▍         | 1107/1261 [09:07<01:15,  2.03it/s]
 88%|████████████████████████████████████████████████████████████████████▌         | 1108/1261 [09:07<01:24,  1.80it/s]
 88%|████████████████████████████████████████████████████████████████████▌         | 1109/1261 [09:08<01:21,  1.86it/s]
 88%|████████████████████████████████████████████████████████████████████▋         | 1110/1261 [09:08<01:17,  1.95it/s]
 88%|████████████████████████████████████████████████████████████████████▋         | 1111/1261 [09:09<01:13,  2.04it/s]
 88%|████████████████████████████████████████████████████████████████████▊         | 1112/1261 [09:09<01:11,  2.07it/s]
 88%|████████████████████████████████████████████████████████████████████▊         | 1113/1261 [09:10<01:10,  2.10it/s]
 88%|████████████████████████████████████████████████████████████████████▉         | 1114/1261 [09:10<01:09,  2.11it/s]
 88%|████████████████████████████████████████████████████████████████████▉         | 1115/1261 [09:11<01:08,  2.12it/s]
 89%|█████████████████████████████████████████████████████████████████████         | 1116/1261 [09:11<01:08,  2.12it/s]
 89%|█████████████████████████████████████████████████████████████████████         | 1117/1261 [09:11<01:07,  2.14it/s]
 89%|█████████████████████████████████████████████████████████████████████▏        | 1118/1261 [09:12<01:08,  2.10it/s]
 89%|█████████████████████████████████████████████████████████████████████▏        | 1119/1261 [09:13<01:19,  1.79it/s]
 89%|█████████████████████████████████████████████████████████████████████▎        | 1120/1261 [09:13<01:14,  1.89it/s]
 89%|█████████████████████████████████████████████████████████████████████▎        | 1121/1261 [09:14<01:10,  1.99it/s]
 89%|█████████████████████████████████████████████████████████████████████▍        | 1122/1261 [09:14<01:06,  2.09it/s]
 89%|█████████████████████████████████████████████████████████████████████▍        | 1123/1261 [09:14<01:04,  2.13it/s]
 89%|█████████████████████████████████████████████████████████████████████▌        | 1124/1261 [09:15<01:04,  2.13it/s]
 89%|█████████████████████████████████████████████████████████████████████▌        | 1125/1261 [09:15<01:05,  2.08it/s]
 89%|█████████████████████████████████████████████████████████████████████▋        | 1126/1261 [09:16<01:06,  2.02it/s]
 89%|█████████████████████████████████████████████████████████████████████▋        | 1127/1261 [09:17<01:07,  1.99it/s]
 89%|█████████████████████████████████████████████████████████████████████▊        | 1128/1261 [09:17<01:05,  2.04it/s]
 90%|█████████████████████████████████████████████████████████████████████▊        | 1129/1261 [09:17<01:04,  2.04it/s]
 90%|█████████████████████████████████████████████████████████████████████▉        | 1130/1261 [09:18<01:16,  1.71it/s]
 90%|█████████████████████████████████████████████████████████████████████▉        | 1131/1261 [09:19<01:11,  1.82it/s]
 90%|██████████████████████████████████████████████████████████████████████        | 1132/1261 [09:19<01:06,  1.93it/s]
 90%|██████████████████████████████████████████████████████████████████████        | 1133/1261 [09:20<01:03,  2.01it/s]
 90%|██████████████████████████████████████████████████████████████████████▏       | 1134/1261 [09:20<01:02,  2.03it/s]
 90%|██████████████████████████████████████████████████████████████████████▏       | 1135/1261 [09:21<01:00,  2.10it/s]
 90%|██████████████████████████████████████████████████████████████████████▎       | 1136/1261 [09:21<00:59,  2.10it/s]
 90%|██████████████████████████████████████████████████████████████████████▎       | 1137/1261 [09:22<00:59,  2.09it/s]
 90%|██████████████████████████████████████████████████████████████████████▍       | 1138/1261 [09:22<00:57,  2.15it/s]
 90%|██████████████████████████████████████████████████████████████████████▍       | 1139/1261 [09:22<00:55,  2.18it/s]
 90%|██████████████████████████████████████████████████████████████████████▌       | 1140/1261 [09:23<00:55,  2.20it/s]
 90%|██████████████████████████████████████████████████████████████████████▌       | 1141/1261 [09:23<00:59,  2.01it/s]
 91%|██████████████████████████████████████████████████████████████████████▋       | 1142/1261 [09:24<01:05,  1.83it/s]
 91%|██████████████████████████████████████████████████████████████████████▋       | 1143/1261 [09:25<01:00,  1.94it/s]
 91%|██████████████████████████████████████████████████████████████████████▊       | 1144/1261 [09:25<00:57,  2.04it/s]
 91%|██████████████████████████████████████████████████████████████████████▊       | 1145/1261 [09:25<00:55,  2.11it/s]
 91%|██████████████████████████████████████████████████████████████████████▉       | 1146/1261 [09:26<00:53,  2.15it/s]
 91%|██████████████████████████████████████████████████████████████████████▉       | 1147/1261 [09:26<00:52,  2.19it/s]
 91%|███████████████████████████████████████████████████████████████████████       | 1148/1261 [09:27<00:51,  2.20it/s]
 91%|███████████████████████████████████████████████████████████████████████       | 1149/1261 [09:27<00:51,  2.18it/s]
 91%|███████████████████████████████████████████████████████████████████████▏      | 1150/1261 [09:28<00:50,  2.21it/s]
 91%|███████████████████████████████████████████████████████████████████████▏      | 1151/1261 [09:28<00:48,  2.26it/s]
 91%|███████████████████████████████████████████████████████████████████████▎      | 1152/1261 [09:29<00:49,  2.21it/s]
 91%|███████████████████████████████████████████████████████████████████████▎      | 1153/1261 [09:29<00:54,  1.98it/s]
 92%|███████████████████████████████████████████████████████████████████████▍      | 1154/1261 [09:30<00:55,  1.94it/s]
 92%|███████████████████████████████████████████████████████████████████████▍      | 1155/1261 [09:30<00:52,  2.04it/s]
 92%|███████████████████████████████████████████████████████████████████████▌      | 1156/1261 [09:31<00:50,  2.06it/s]
 92%|███████████████████████████████████████████████████████████████████████▌      | 1157/1261 [09:31<00:49,  2.10it/s]
 92%|███████████████████████████████████████████████████████████████████████▋      | 1158/1261 [09:31<00:47,  2.15it/s]
 92%|███████████████████████████████████████████████████████████████████████▋      | 1159/1261 [09:32<00:46,  2.20it/s]
 92%|███████████████████████████████████████████████████████████████████████▊      | 1160/1261 [09:32<00:45,  2.20it/s]
 92%|███████████████████████████████████████████████████████████████████████▊      | 1161/1261 [09:33<00:44,  2.25it/s]
 92%|███████████████████████████████████████████████████████████████████████▉      | 1162/1261 [09:33<00:43,  2.28it/s]
 92%|███████████████████████████████████████████████████████████████████████▉      | 1163/1261 [09:34<00:42,  2.30it/s]
 92%|████████████████████████████████████████████████████████████████████████      | 1164/1261 [09:34<00:41,  2.32it/s]
 92%|████████████████████████████████████████████████████████████████████████      | 1165/1261 [09:35<00:47,  2.01it/s]
 92%|████████████████████████████████████████████████████████████████████████      | 1166/1261 [09:35<00:48,  1.95it/s]
 93%|████████████████████████████████████████████████████████████████████████▏     | 1167/1261 [09:36<00:46,  2.02it/s]
 93%|████████████████████████████████████████████████████████████████████████▏     | 1168/1261 [09:36<00:45,  2.06it/s]
 93%|████████████████████████████████████████████████████████████████████████▎     | 1169/1261 [09:37<00:43,  2.12it/s]
 93%|████████████████████████████████████████████████████████████████████████▎     | 1170/1261 [09:37<00:41,  2.18it/s]
 93%|████████████████████████████████████████████████████████████████████████▍     | 1171/1261 [09:38<00:44,  2.02it/s]
 93%|████████████████████████████████████████████████████████████████████████▍     | 1172/1261 [09:38<00:42,  2.11it/s]
 93%|████████████████████████████████████████████████████████████████████████▌     | 1173/1261 [09:38<00:40,  2.19it/s]
 93%|████████████████████████████████████████████████████████████████████████▌     | 1174/1261 [09:39<00:39,  2.19it/s]
 93%|████████████████████████████████████████████████████████████████████████▋     | 1175/1261 [09:39<00:38,  2.23it/s]
 93%|████████████████████████████████████████████████████████████████████████▋     | 1176/1261 [09:40<00:38,  2.22it/s]
 93%|████████████████████████████████████████████████████████████████████████▊     | 1177/1261 [09:41<00:43,  1.91it/s]
 93%|████████████████████████████████████████████████████████████████████████▊     | 1178/1261 [09:41<00:41,  1.98it/s]
 93%|████████████████████████████████████████████████████████████████████████▉     | 1179/1261 [09:41<00:39,  2.06it/s]
 94%|████████████████████████████████████████████████████████████████████████▉     | 1180/1261 [09:42<00:37,  2.14it/s]
 94%|█████████████████████████████████████████████████████████████████████████     | 1181/1261 [09:42<00:37,  2.13it/s]
 94%|█████████████████████████████████████████████████████████████████████████     | 1182/1261 [09:43<00:36,  2.19it/s]
 94%|█████████████████████████████████████████████████████████████████████████▏    | 1183/1261 [09:43<00:38,  2.04it/s]
 94%|█████████████████████████████████████████████████████████████████████████▏    | 1184/1261 [09:44<00:37,  2.05it/s]
 94%|█████████████████████████████████████████████████████████████████████████▎    | 1185/1261 [09:44<00:36,  2.09it/s]
 94%|█████████████████████████████████████████████████████████████████████████▎    | 1186/1261 [09:45<00:44,  1.67it/s]
 94%|█████████████████████████████████████████████████████████████████████████▍    | 1187/1261 [09:46<00:48,  1.52it/s]
 94%|█████████████████████████████████████████████████████████████████████████▍    | 1188/1261 [09:46<00:45,  1.61it/s]
 94%|█████████████████████████████████████████████████████████████████████████▌    | 1189/1261 [09:47<00:40,  1.77it/s]
 94%|█████████████████████████████████████████████████████████████████████████▌    | 1190/1261 [09:47<00:37,  1.88it/s]
 94%|█████████████████████████████████████████████████████████████████████████▋    | 1191/1261 [09:48<00:35,  1.96it/s]
 95%|█████████████████████████████████████████████████████████████████████████▋    | 1192/1261 [09:48<00:34,  2.02it/s]
 95%|█████████████████████████████████████████████████████████████████████████▊    | 1193/1261 [09:49<00:33,  2.01it/s]
 95%|█████████████████████████████████████████████████████████████████████████▊    | 1194/1261 [09:49<00:33,  1.99it/s]
 95%|█████████████████████████████████████████████████████████████████████████▉    | 1195/1261 [09:50<00:35,  1.86it/s]
 95%|█████████████████████████████████████████████████████████████████████████▉    | 1196/1261 [09:51<00:36,  1.79it/s]
 95%|██████████████████████████████████████████████████████████████████████████    | 1197/1261 [09:51<00:40,  1.57it/s]
 95%|██████████████████████████████████████████████████████████████████████████    | 1198/1261 [09:52<00:40,  1.57it/s]
 95%|██████████████████████████████████████████████████████████████████████████▏   | 1199/1261 [09:52<00:36,  1.70it/s]
 95%|██████████████████████████████████████████████████████████████████████████▏   | 1200/1261 [09:53<00:33,  1.83it/s]
 95%|██████████████████████████████████████████████████████████████████████████▎   | 1201/1261 [09:53<00:31,  1.90it/s]
 95%|██████████████████████████████████████████████████████████████████████████▎   | 1202/1261 [09:54<00:29,  1.99it/s]
 95%|██████████████████████████████████████████████████████████████████████████▍   | 1203/1261 [09:54<00:28,  2.03it/s]
 95%|██████████████████████████████████████████████████████████████████████████▍   | 1204/1261 [09:55<00:27,  2.10it/s]
 96%|██████████████████████████████████████████████████████████████████████████▌   | 1205/1261 [09:55<00:26,  2.09it/s]
 96%|██████████████████████████████████████████████████████████████████████████▌   | 1206/1261 [09:56<00:26,  2.05it/s]
 96%|██████████████████████████████████████████████████████████████████████████▋   | 1207/1261 [09:56<00:26,  2.06it/s]
 96%|██████████████████████████████████████████████████████████████████████████▋   | 1208/1261 [09:57<00:27,  1.94it/s]
 96%|██████████████████████████████████████████████████████████████████████████▊   | 1209/1261 [09:58<00:30,  1.72it/s]
 96%|██████████████████████████████████████████████████████████████████████████▊   | 1210/1261 [09:58<00:28,  1.78it/s]
 96%|██████████████████████████████████████████████████████████████████████████▉   | 1211/1261 [09:59<00:27,  1.84it/s]
 96%|██████████████████████████████████████████████████████████████████████████▉   | 1212/1261 [09:59<00:25,  1.94it/s]
 96%|███████████████████████████████████████████████████████████████████████████   | 1213/1261 [10:00<00:26,  1.79it/s]
 96%|███████████████████████████████████████████████████████████████████████████   | 1214/1261 [10:00<00:24,  1.89it/s]
 96%|███████████████████████████████████████████████████████████████████████████▏  | 1215/1261 [10:01<00:23,  1.99it/s]
 96%|███████████████████████████████████████████████████████████████████████████▏  | 1216/1261 [10:01<00:21,  2.06it/s]
 97%|███████████████████████████████████████████████████████████████████████████▎  | 1217/1261 [10:01<00:21,  2.09it/s]
 97%|███████████████████████████████████████████████████████████████████████████▎  | 1218/1261 [10:02<00:20,  2.10it/s]
 97%|███████████████████████████████████████████████████████████████████████████▍  | 1219/1261 [10:02<00:20,  2.01it/s]
 97%|███████████████████████████████████████████████████████████████████████████▍  | 1220/1261 [10:03<00:22,  1.81it/s]
 97%|███████████████████████████████████████████████████████████████████████████▌  | 1221/1261 [10:04<00:20,  1.92it/s]
 97%|███████████████████████████████████████████████████████████████████████████▌  | 1222/1261 [10:04<00:19,  2.00it/s]
 97%|███████████████████████████████████████████████████████████████████████████▋  | 1223/1261 [10:04<00:18,  2.08it/s]
 97%|███████████████████████████████████████████████████████████████████████████▋  | 1224/1261 [10:05<00:17,  2.12it/s]
 97%|███████████████████████████████████████████████████████████████████████████▊  | 1225/1261 [10:05<00:16,  2.17it/s]
 97%|███████████████████████████████████████████████████████████████████████████▊  | 1226/1261 [10:06<00:16,  2.13it/s]
 97%|███████████████████████████████████████████████████████████████████████████▉  | 1227/1261 [10:06<00:16,  2.06it/s]
 97%|███████████████████████████████████████████████████████████████████████████▉  | 1228/1261 [10:07<00:15,  2.12it/s]
 97%|████████████████████████████████████████████████████████████████████████████  | 1229/1261 [10:07<00:16,  1.95it/s]
 98%|████████████████████████████████████████████████████████████████████████████  | 1230/1261 [10:09<00:21,  1.46it/s]
 98%|████████████████████████████████████████████████████████████████████████████▏ | 1231/1261 [10:09<00:18,  1.60it/s]
 98%|████████████████████████████████████████████████████████████████████████████▏ | 1232/1261 [10:09<00:16,  1.72it/s]
 98%|████████████████████████████████████████████████████████████████████████████▎ | 1233/1261 [10:10<00:15,  1.82it/s]
 98%|████████████████████████████████████████████████████████████████████████████▎ | 1234/1261 [10:11<00:15,  1.73it/s]
 98%|████████████████████████████████████████████████████████████████████████████▍ | 1235/1261 [10:11<00:14,  1.73it/s]
 98%|████████████████████████████████████████████████████████████████████████████▍ | 1236/1261 [10:12<00:14,  1.78it/s]
 98%|████████████████████████████████████████████████████████████████████████████▌ | 1237/1261 [10:12<00:12,  1.90it/s]
 98%|████████████████████████████████████████████████████████████████████████████▌ | 1238/1261 [10:13<00:11,  1.95it/s]
 98%|████████████████████████████████████████████████████████████████████████████▋ | 1239/1261 [10:13<00:10,  2.03it/s]
 98%|████████████████████████████████████████████████████████████████████████████▋ | 1240/1261 [10:14<00:10,  2.04it/s]
 98%|████████████████████████████████████████████████████████████████████████████▊ | 1241/1261 [10:14<00:10,  1.84it/s]
 98%|████████████████████████████████████████████████████████████████████████████▊ | 1242/1261 [10:15<00:09,  1.92it/s]
 99%|████████████████████████████████████████████████████████████████████████████▉ | 1243/1261 [10:15<00:08,  2.02it/s]
 99%|████████████████████████████████████████████████████████████████████████████▉ | 1244/1261 [10:16<00:08,  2.04it/s]
 99%|█████████████████████████████████████████████████████████████████████████████ | 1245/1261 [10:16<00:07,  2.03it/s]
 99%|█████████████████████████████████████████████████████████████████████████████ | 1246/1261 [10:17<00:07,  2.03it/s]
 99%|█████████████████████████████████████████████████████████████████████████████▏| 1247/1261 [10:17<00:06,  2.05it/s]
 99%|█████████████████████████████████████████████████████████████████████████████▏| 1248/1261 [10:18<00:06,  1.92it/s]
 99%|█████████████████████████████████████████████████████████████████████████████▎| 1249/1261 [10:18<00:05,  2.02it/s]
 99%|█████████████████████████████████████████████████████████████████████████████▎| 1250/1261 [10:19<00:05,  2.03it/s]
 99%|█████████████████████████████████████████████████████████████████████████████▍| 1251/1261 [10:19<00:05,  1.86it/s]
 99%|█████████████████████████████████████████████████████████████████████████████▍| 1252/1261 [10:20<00:05,  1.54it/s]
 99%|█████████████████████████████████████████████████████████████████████████████▌| 1253/1261 [10:21<00:04,  1.66it/s]
 99%|█████████████████████████████████████████████████████████████████████████████▌| 1254/1261 [10:22<00:04,  1.42it/s]
100%|█████████████████████████████████████████████████████████████████████████████▋| 1255/1261 [10:23<00:04,  1.29it/s]
100%|█████████████████████████████████████████████████████████████████████████████▋| 1256/1261 [10:23<00:03,  1.42it/s]
100%|█████████████████████████████████████████████████████████████████████████████▊| 1257/1261 [10:24<00:02,  1.53it/s]
100%|█████████████████████████████████████████████████████████████████████████████▊| 1258/1261 [10:24<00:01,  1.67it/s]
100%|█████████████████████████████████████████████████████████████████████████████▉| 1259/1261 [10:25<00:01,  1.76it/s]
100%|█████████████████████████████████████████████████████████████████████████████▉| 1260/1261 [10:25<00:00,  1.61it/s]
[MoviePy] Done.
[MoviePy] >>>> Video ready: output_images/project_video_out_th0.5_scale[1.5, 2]_que3.mp4 

Wall time: 10min 27s
In [172]:
HTML("""
<video width="960" height="540" controls>
  <source src="{0}">
</video>
""".format(VIDEO_OUTPUT))
Out[172]:

Discussion

1. Briefly discuss any problems / issues you faced in your implementation of this project. Where will your pipeline likely fail? What could you do to make it more robust?

Here I'll talk about the approach I took, what techniques I used, what worked and why, where the pipeline might fail and how I might improve it if I were going to pursue this project further.

  • Tendency per color of cars
  • Scale modification for far small-looking car
Source Destination Destination
color_space 'HSV' 'HLS' #'RGB' # Can be RGB, HSV, LUV, HLS, YUV, YCrCb
orient 9 HOG orientations
pix_per_cell 8 HOG pixels per cell
cell_per_block 2 HOG cells per block
hog_channel "ALL" 1 # "ALL" #0 # Can be 0, 1, 2, or "ALL"
spatial_size (16, 16) Spatial binning dimensions
hist_bins 16#32#16#32 #16 Number of histogram bins
spatial_feat True Spatial features on or off
hist_feat True Histogram features on or off
hog_feat True HOG features on or off
y_start_stop [None, None] Min and max in y to search in slide_window()